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

การจำกัดชนิดที่เกี่ยวข้อง

จำกัดชนิดที่เกี่ยวข้องในบริบทแบบทั่วไป

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

ทบทวนชนิดข้อมูลที่เกี่ยวข้อง

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

protocol Container {
    associatedtype Item
    var count: Int { get }
    func item(at i: Int) -> Item
}

การสอดคล้องด้วยชนิดข้อมูลรูปธรรม

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

protocol Container {
    associatedtype Item
    func item(at i: Int) -> Item
}
struct IntBox: Container {
    let values: [Int]
    func item(at i: Int) -> Int { values[i] }
}
print(IntBox(values: [10, 20]).item(at: 1))

การจำกัดชนิดข้อมูลที่เกี่ยวข้อง

เพิ่มข้อจำกัดไว้ในประกาศได้โดยตรง: associatedtype Item: Comparable จะบังคับให้ชนิดข้อมูลของ item ในทุกชนิดข้อมูลที่สอดคล้องรองรับการเปรียบเทียบ

protocol Sorted {
    associatedtype Item: Comparable
    var items: [Item] { get }
}
struct Nums: Sorted { let items: [Int] }
print(Nums(items: [3, 1, 2]).items.sorted())

การใช้ข้อจำกัด

เนื่องจากชนิดข้อมูลที่เกี่ยวข้องมีข้อจำกัด ส่วนขยายของโปรโตคอลจึงสามารถพึ่งพาความสามารถนั้นได้

protocol Sorted {
    associatedtype Item: Comparable
    var items: [Item] { get }
}
extension Sorted {
    var smallest: Item? { items.min() }
}
struct Nums: Sorted { let items: [Int] }
print(Nums(items: [5, 2, 8]).smallest!)

where กับ associatedtype

Swift ยังอนุญาตให้ใช้อนุประโยค where กับชนิดข้อมูลที่เกี่ยวข้อง เพื่อเชื่อมโยงชนิดข้อมูลนั้นกับชนิดข้อมูลที่เกี่ยวข้องอีกชนิดหรือชนิดข้อมูลแบบซ้อนได้

protocol Sequence2 {
    associatedtype Element
    associatedtype Iterator: IteratorProtocol where Iterator.Element == Element
}

การจำกัดให้เป็นไปตามโปรโตคอลอื่น

คุณสามารถกำหนดให้ชนิดข้อมูลที่เกี่ยวข้องสอดคล้องกับโปรโตคอลที่คุณกำหนดเองได้ เพื่อเพิ่มการทำงานเป็นชั้น ๆ

protocol HasName { var name: String { get } }
protocol Registry {
    associatedtype Entry: HasName
    var entries: [Entry] { get }
}
struct User: HasName { let name: String }
struct Users: Registry { let entries: [User] }
print(Users(entries: [User(name: "Ada")]).entries[0].name)

ชนิดข้อมูลที่เกี่ยวข้องหลายตัว

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

protocol Mapping {
    associatedtype Key: Hashable
    associatedtype Value
    func value(for k: Key) -> Value?
}
struct Phonebook: Mapping {
    let data: [String: Int]
    func value(for k: String) -> Int? { data[k] }
}
print(Phonebook(data: ["x": 1]).value(for: "x")!)

ชนิดข้อมูลที่เกี่ยวข้องเริ่มต้น

คุณสามารถกำหนดค่าเริ่มต้นให้ชนิดข้อมูลที่เกี่ยวข้องด้วย = ซึ่งจะถูกใช้เมื่อชนิดข้อมูลที่สอดคล้องไม่ได้ระบุชนิดนั้นไว้เป็นอย่างอื่น

protocol Producer {
    associatedtype Output = String
    func make() -> Output
}
struct Hello: Producer {
    func make() -> String { "hi" }
}
print(Hello().make())

ข้อจำกัดช่วยให้อัลกอริทึม generic ทำงานได้

เมื่อชนิดข้อมูลที่เกี่ยวข้องมีข้อจำกัด ส่วนขยายของโปรโตคอลก็สามารถนำอัลกอริทึมจริงที่ใช้ร่วมกันโดยชนิดข้อมูลที่สอดคล้องทั้งหมดไปใช้งานได้

protocol Scored {
    associatedtype Score: Comparable
    var scores: [Score] { get }
}
extension Scored {
    var best: Score? { scores.max() }
}
struct Game: Scored { let scores: [Int] }
print(Game(scores: [10, 40, 25]).best!)

ข้อจำกัดชนิดข้อมูลเดียวกันในส่วนขยาย

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

protocol Box2 {
    associatedtype Content
    var content: Content { get }
}
extension Box2 where Content == Int {
    var doubled: Int { content * 2 }
}
struct IB: Box2 { let content: Int }
print(IB(content: 7).doubled)

เหตุใดจึงต้องจำกัด

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

protocol Listy {
    associatedtype E: Equatable
    var elements: [E] { get }
}
extension Listy {
    func has(_ x: E) -> Bool { elements.contains(x) }
}
struct L: Listy { let elements: [String] }
print(L(elements: ["a", "b"]).has("b"))

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจของคุณเกี่ยวกับการจำกัดชนิดข้อมูลที่เกี่ยวข้อง

ทบทวน

คุณสามารถจำกัดชนิดข้อมูลที่เกี่ยวข้องได้โดยตรง (associatedtype Item: Comparable) เชื่อมโยงชนิดข้อมูลเหล่านั้นด้วยอนุประโยค where กำหนดให้สอดคล้องกับโปรโตคอล ให้ค่าเริ่มต้นด้วย = ประกาศชนิดข้อมูลที่เกี่ยวข้องหลายตัว และปรับข้อกำหนดเพิ่มเติมในส่วนขยายได้ ข้อจำกัดช่วยให้ส่วนขยายของโปรโตคอลใช้อัลกอริทึมที่ใช้ร่วมกันและปลอดภัยด้านชนิดข้อมูล

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

บทเรียน “การจำกัดชนิดที่เกี่ยวข้อง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การจำกัดชนิดที่เกี่ยวข้อง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ 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. อนุประโยค where ในฟังก์ชัน
  3. การจำกัดชนิดที่เกี่ยวข้อง
  4. ซับสคริปต์และส่วนขยายแบบทั่วไป
← กลับไปที่ Swift Academy