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