.count }.reduce(0, +) return Int(round(Double(size) / Double(count.toIntMax()))) } }

ตอนนี้เราสามารถคำนวณขนาดเฉลี่ยของคอลเลกชันของคิวใดก็ได้ (Array, Set ฯลฯ ) หากไม่มีส่วนขยายโปรโตคอลเราจำเป็นต้องเพิ่มวิธีนี้ในคอลเล็กชันแต่ละประเภทแยกกัน

ในไลบรารีมาตรฐานของ Swift ส่วนขยายโปรโตคอลจะใช้ในการปรับใช้เช่นวิธีการเช่น map, filter, reduce เป็นต้น

ปัญหาความปลอดภัยของอีเมลที่ป้องกันได้คือ
extension Collection { public func map(_ transform: (Self.Iterator.Element) throws -> T) rethrows -> [T] { } }

ส่วนขยายของโปรโตคอลและความหลากหลาย

ดังที่ฉันได้กล่าวไว้ก่อนหน้านี้ส่วนขยายโปรโตคอลช่วยให้เราสามารถเพิ่มการใช้งานเริ่มต้นของวิธีการบางอย่างและเพิ่มการใช้งานวิธีการใหม่ได้เช่นกัน แต่คุณสมบัติทั้งสองนี้แตกต่างกันอย่างไร? กลับไปที่ตัวจัดการข้อผิดพลาดและค้นหาคำตอบ

protocol ErrorHandler { func handle(error: Error) } extension ErrorHandler { func handle(error: Error) { print(error.localizedDescription) } } struct Handler: ErrorHandler { func handle(error: Error) { fatalError('Unexpected error occurred') } } enum ApplicationError: Error { case other } let handler: Handler = Handler() handler.handle(error: ApplicationError.other)

ผลลัพธ์คือข้อผิดพลาดร้ายแรง

ตอนนี้ลบ handle(error: Error) วิธีการประกาศจากโปรโตคอล

protocol ErrorHandler { }

ผลลัพธ์เหมือนกัน: ข้อผิดพลาดร้ายแรง

หมายความว่าไม่มีความแตกต่างระหว่างการเพิ่มการใช้งานเริ่มต้นของวิธีโปรโตคอลและการเพิ่มการใช้งานวิธีการใหม่ในโปรโตคอลหรือไม่?

ไม่! มีความแตกต่างอยู่และคุณสามารถเห็นได้โดยการเปลี่ยนประเภทของตัวแปร handler จาก Handler ถึง ErrorHandler.

let handler: ErrorHandler = Handler()

ตอนนี้ผลลัพธ์ไปยังคอนโซลคือ: ไม่สามารถดำเนินการให้เสร็จสิ้นได้ (ApplicationError error 0. )

แต่ถ้าเราส่งคืนการประกาศของวิธีการจัดการ (ข้อผิดพลาด: ข้อผิดพลาด) ไปยังโปรโตคอลผลลัพธ์จะเปลี่ยนกลับเป็นข้อผิดพลาดร้ายแรง

protocol ErrorHandler { func handle(error: Error) }

มาดูลำดับสิ่งที่เกิดขึ้นในแต่ละกรณี

เมื่อมีการประกาศเมธอดในโปรโตคอล:

โปรโตคอลประกาศ handle(error: Error) วิธีการและให้การใช้งานเริ่มต้น วิธีนี้ถูกแทนที่ใน Handler การนำไปใช้งาน ดังนั้นการนำเมธอดไปใช้อย่างถูกต้องจึงถูกเรียกใช้ในรันไทม์โดยไม่คำนึงถึงประเภทของตัวแปร

เมื่อไม่มีการประกาศวิธีการในโปรโตคอล:

เนื่องจากไม่มีการประกาศเมธอดในโปรโตคอลประเภทจึงไม่สามารถแทนที่ได้ นั่นคือเหตุผลที่การใช้วิธีการที่เรียกว่าขึ้นอยู่กับชนิดของตัวแปร

หากตัวแปรเป็นประเภท Handler การใช้เมธอดจากประเภทจะถูกเรียกใช้ ในกรณีที่ตัวแปรเป็นประเภท ErrorHandler จะมีการเรียกใช้วิธีการจากส่วนขยายโปรโตคอล

Protocol-oriented Code: ปลอดภัย แต่แสดงออกได้

ในบทความนี้เราได้แสดงให้เห็นถึงพลังของส่วนขยายโปรโตคอลใน Swift

ไม่เหมือนกับภาษาโปรแกรมอื่น ๆ ที่มีอินเทอร์เฟซ Swift ไม่ จำกัด โปรโตคอลด้วยข้อ จำกัด ที่ไม่จำเป็น Swift ทำงานร่วมกับภาษาโปรแกรมเหล่านั้นโดยให้ผู้พัฒนาแก้ไขความไม่ชัดเจนได้ตามความจำเป็น

ด้วยโปรโตคอล Swift และส่วนขยายโปรโตคอลรหัสที่คุณเขียนสามารถแสดงออกได้เหมือนกับภาษาโปรแกรมแบบไดนามิกส่วนใหญ่และยังปลอดภัยในการคอมไพล์ สิ่งนี้ช่วยให้คุณมั่นใจได้ว่าโค้ดของคุณจะสามารถนำกลับมาใช้ใหม่และบำรุงรักษาได้และทำการเปลี่ยนแปลงในโค้ดเบสของแอป Swift ได้อย่างมั่นใจยิ่งขึ้น

เราหวังว่าบทความนี้จะเป็นประโยชน์สำหรับคุณและยินดีรับฟังความคิดเห็นหรือข้อมูลเชิงลึกเพิ่มเติม