0Pricing
Swift Academy · บทเรียน

การประกอบโพรโทคอล

รวมข้อกำหนดจากหลายโพรโทคอลด้วย &

การประกอบโพรโทคอล เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. โพรโทคอลในฐานะสัญญา
  2. การใช้งานเริ่มต้นในส่วนขยาย
  3. การประกอบโพรโทคอล
  4. การสอดคล้องตามเงื่อนไข
← กลับไปที่ Swift Academy