การประกอบโพรโทคอล
รวมข้อกำหนดจากหลายโพรโทคอลด้วย &
การประกอบโพรโทคอล เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
การรวมโปรโตคอล
บางครั้งค่าหนึ่งต้องทำตามโปรโตคอลหลายรายการพร้อมกัน Swift อนุญาตให้คุณประกอบโปรโตคอลด้วยตัวดำเนินการ & เช่น SomeProtocol & AnotherProtocol
protocol Named { var name: String { get } }
protocol Aged { var age: Int { get } }พารามิเตอร์แบบประกอบ
พารามิเตอร์ที่มีชนิดเป็น Named & Aged จะยอมรับค่าใด ๆ ที่ทำตามโปรโตคอลทั้งสอง
protocol Named { var name: String { get } }
protocol Aged { var age: Int { get } }
struct Person: Named, Aged {
let name: String
let age: Int
}
func intro(_ x: Named & Aged) {
print(x.name + " is " + String(x.age))
}
intro(Person(name: "Sam", age: 28))เหตุใดจึงไม่ใช้การสืบทอด
การประกอบช่วยให้คุณกำหนดให้ต้องทำตามโปรโตคอลทั้งสองที่จุดเรียกใช้ได้ โดยไม่ต้องสร้างโปรโตคอลรวมใหม่ ทำให้โปรโตคอลมีขนาดเล็กและนำกลับมาใช้ซ้ำได้
protocol Drawable { func draw() -> String }
protocol Resizable { func resize(_ f: Double) -> String }
struct Icon: Drawable, Resizable {
func draw() -> String { "drawing" }
func resize(_ f: Double) -> String { "x" + String(f) }
}
func render(_ v: Drawable & Resizable) {
print(v.draw(), v.resize(2))
}
render(Icon())สามโปรโตคอลขึ้นไป
คุณสามารถเชื่อมโปรโตคอลได้มากเท่าที่ต้องการด้วยตัวดำเนินการ & เพิ่มเติม
protocol A { func a() -> String }
protocol B { func b() -> String }
protocol C { func c() -> String }
struct X: A, B, C {
func a() -> String { "a" }
func b() -> String { "b" }
func c() -> String { "c" }
}
func use(_ v: A & B & C) { print(v.a(), v.b(), v.c()) }
use(X())การประกอบกับคลาส
คุณสามารถรวมชนิดคลาสเข้ากับโปรโตคอลได้ เช่น SomeClass & SomeProtocol ซึ่งกำหนดให้ค่าต้องเป็นคลาสนั้น (หรือคลาสย่อย) AND ต้องทำตามโปรโตคอลด้วย
class Vehicle { var speed = 0 }
protocol Electric { var battery: Int { get } }
class Tesla: Vehicle, Electric { var battery = 100 }
func check(_ v: Vehicle & Electric) {
print(v.speed, v.battery)
}
check(Tesla())การคืนค่าชนิดแบบประกอบ
ฟังก์ชันสามารถคืนค่าชนิดแบบประกอบ เพื่อรับรองแก่ผู้เรียกว่าผลลัพธ์ทำตามโปรโตคอลที่ระบุไว้ทั้งหมด
protocol Named { var name: String { get } }
protocol Aged { var age: Int { get } }
struct Person: Named, Aged { let name: String; let age: Int }
func makePerson() -> Named & Aged {
Person(name: "Eve", age: 22)
}
let p = makePerson()
print(p.name, p.age)typealias สำหรับการประกอบ
ตั้งชื่อที่อ่านง่ายให้การประกอบด้วย typealias เพื่อให้นำกลับมาใช้ซ้ำได้โดยไม่ต้องเขียนสายโซ่ & ซ้ำ
protocol Codable2 { func encode() -> String }
protocol Loggable { func log() -> String }
typealias Persistable = Codable2 & Loggable
struct Record: Persistable {
func encode() -> String { "data" }
func log() -> String { "logged" }
}
func save(_ r: Persistable) { print(r.encode(), r.log()) }
save(Record())การประกอบในคอลเลกชัน
คุณสามารถจัดเก็บค่าแบบประกอบไว้ในอาร์เรย์ และเข้าถึงสมาชิกของโปรโตคอลทั้งหมดได้ในแต่ละองค์ประกอบ
protocol Named { var name: String { get } }
protocol Aged { var age: Int { get } }
struct P: Named, Aged { let name: String; let age: Int }
let group: [Named & Aged] = [P(name: "A", age: 1), P(name: "B", age: 2)]
for g in group { print(g.name, g.age) }การประกอบกับโปรโตคอลมาตรฐาน
การประกอบมีประโยชน์อย่างมากเมื่อใช้กับโปรโตคอลจากไลบรารี เช่น กำหนดให้ต้องทำตามทั้ง CustomStringConvertible และ Equatable
func report<T>(_ items: [T]) where T: CustomStringConvertible & Equatable {
for i in items { print(i.description) }
}
report([1, 2, 3])โปรโตคอลว่างเปล่าในฐานะเครื่องหมาย
การประกอบสามารถรวมโปรโตคอลเครื่องหมาย (ไม่มีข้อกำหนด) เข้ากับโปรโตคอลเชิงฟังก์ชัน เพื่อสื่อเจตนาในระบบชนิดข้อมูลได้
protocol Secure {}
protocol Sendable2 { func send() -> String }
struct Packet: Secure, Sendable2 {
func send() -> String { "sent securely" }
}
func transmit(_ p: Secure & Sendable2) { print(p.send()) }
transmit(Packet())การประกอบเทียบกับเจเนอริก
การประกอบ (A & B) จะลบชนิดข้อมูลรูปธรรมออก ส่วนเจเนอริก (<T: A & B>) จะคงชนิดข้อมูลนั้นไว้ ใช้เจเนอริกเมื่อจำเป็นต้องเชื่อมโยงชนิดของพารามิเตอร์กับชนิดค่าที่ส่งกลับ
protocol A { func a() -> String }
protocol B { func b() -> String }
struct S: A, B { func a() -> String { "a" }; func b() -> String { "b" } }
func generic<T: A & B>(_ x: T) -> T { print(x.a(), x.b()); return x }
_ = generic(S())ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจของคุณเกี่ยวกับการประกอบโปรโตคอล
ทบทวน
การประกอบโปรโตคอลด้วย & ช่วยให้คุณกำหนดให้ชนิดข้อมูลต้องสอดคล้องกับ โปรโตคอลหลายรายการ (และเลือกกำหนดคลาสหนึ่งคลาสได้) พร้อมกัน โดยไม่ต้องสร้างโปรโตคอลใหม่ที่รวมกัน คุณสามารถตั้งชื่อการประกอบด้วย typealias ใช้การประกอบกับพารามิเตอร์ ค่าที่ส่งกลับ และคอลเลกชันได้ รวมถึงได้เห็นแล้วว่าการประกอบแตกต่างจากเจเนอริกอย่างไรในด้านการคงชนิดข้อมูลรูปธรรม
คำถามที่พบบ่อย
บทเรียน “การประกอบโพรโทคอล” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การประกอบโพรโทคอล” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การประกอบโพรโทคอล”
รวมข้อกำหนดจากหลายโพรโทคอลด้วย & คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การประกอบโพรโทคอล” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม
ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- โพรโทคอลในฐานะสัญญา
- การใช้งานเริ่มต้นในส่วนขยาย
- การประกอบโพรโทคอล
- การสอดคล้องตามเงื่อนไข