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

associatedtype และโปรโตคอลเจเนอริก

กำหนดโปรโตคอลด้วย associatedtype ดูวิธีที่ชนิดซึ่งสอดคล้องกับโปรโตคอลผูกชนิดเหล่านี้ และใช้ฟังก์ชันเจเนอริกที่มีข้อจำกัดของโปรโตคอล

associatedtype และโปรโตคอลเจเนอริก เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 3 บทเรียน

เหตุใดจึงต้องใช้ชนิดที่เกี่ยวข้อง

โพรโทคอลสามารถเป็น เจเนอริกได้ด้วย associatedtype ชนิดที่ทำตามโพรโทคอลจะผูกตัวแทนนี้เข้ากับชนิดข้อมูลจริง

โพรโทคอลที่มี associatedtype

associatedtype Item ทำหน้าที่คล้ายพารามิเตอร์ชนิดข้อมูล ข้อกำหนดสามารถใช้มันในเมธอด, ซับสคริปต์ และพร็อพเพอร์ตีได้

protocol Container {
    associatedtype Item
    mutating func append(_ item: Item)
    var count: Int { get }
    subscript(index: Int) -> Item { get }
}

การทำตามโพรโทคอลด้วยชนิดจริง

ชนิดที่ทำตามโพรโทคอลจะเลือก Item เป็นชนิดข้อมูลจริง (ในที่นี้คือ Int) โดยใช้งานข้อกำหนดด้วยชนิดนั้น

struct IntStack: Container {
    // Binds Item == Int implicitly by usage
    private var items: [Int] = []
    mutating func append(_ item: Int) { items.append(item) }
    var count: Int { items.count }
    subscript(index: Int) -> Int { items[index] }
}
var st = IntStack()
st.append(10); st.append(20)
print(st.count, st[1])

ชนิดที่ทำตามโพรโทคอลแบบเจเนอริก

ชนิดเจเนอริกสามารถทำตามโพรโทคอลได้โดยผูก Item == Element ทำให้โพรโทคอลยังคงเป็นเจเนอริกและนำกลับมาใช้ได้

struct Stack<Element>: Container {
    private var items: [Element] = []
    mutating func append(_ item: Element) { items.append(item) }
    var count: Int { items.count }
    subscript(index: Int) -> Element { items[index] }
    // Here, associatedtype Item == Element
}
var s = Stack<String>()
s.append("hi"); s.append("bye")
print(s.count, s[1])

การใช้โพรโทคอลในเจเนอริก

จำกัดฟังก์ชันด้วย C: Container คุณสามารถใช้ C.Item ในเชิงนามธรรมได้โดยไม่ต้องกำหนดชนิดตายตัว

// Generic algorithm operating on any Container
func dumpFirstTwo<C: Container>(_ c: C) {
    // We can talk about C.Item but not assume concrete type
    if c.count >= 2 {
        print("0:", c[0])
        print("1:", c[1])
    } else {
        print("too few elements")
    }
}
dumpFirstTwo(s)    // works with Stack<String>
dumpFirstTwo(st)   // works with IntStack

หมายเหตุและเคล็ดลับ

หมายเหตุ:

  • ไม่สามารถใช้โพรโทคอลที่มีชนิดที่เกี่ยวข้องโดยตรงเป็นชนิดข้อมูลได้ ควรเลือกใช้เจเนอริกหรือการลบชนิด
  • ตั้งชื่อตัวแทนให้ชัดเจน เช่น Item, Element
  • การทำตามโพรโทคอลอาจระบุอย่างชัดเจน (typealias Item = ...) หรืออนุมานจากลายเซ็นได้

ความหมายของ associatedtype

ตรวจสอบอย่างรวดเร็ว: associatedtype หมายถึงอะไร

ทบทวน

ทบทวน: ใช้ associatedtype เพื่อทำให้โพรโทคอลเป็นเจเนอริก ชนิดที่ทำตามโพรโทคอลจะเลือกชนิดข้อมูลจริง และฟังก์ชันเจเนอริกสามารถทำงานกับชนิดใดก็ได้ที่ทำตามโพรโทคอลผ่านข้อจำกัด

คำถามที่พบบ่อย

บทเรียน “associatedtype และโปรโตคอลเจเนอริก” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “associatedtype และโปรโตคอลเจเนอริก” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 3 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “associatedtype และโปรโตคอลเจเนอริก”

กำหนดโปรโตคอลด้วย associatedtype ดูวิธีที่ชนิดซึ่งสอดคล้องกับโปรโตคอลผูกชนิดเหล่านี้ และใช้ฟังก์ชันเจเนอริกที่มีข้อจำกัดของโปรโตคอล คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 3 บทเรียน

บทเรียน “associatedtype และโปรโตคอลเจเนอริก” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม

ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. associatedtype และโปรโตคอลเจเนอริก
  2. รูปแบบการลบชนิด (AnySequence/AnyIterator)
  3. เมื่อใดควรใช้ existential (any P) กับเจเนอริก
← กลับไปที่ Swift Academy