การสอดคล้องตามเงื่อนไข
ทำให้สอดคล้องกับโพรโทคอลแบบทั่วไปเฉพาะเมื่อเป็นไปตามข้อจำกัด
การสอดคล้องตามเงื่อนไข เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
การสอดคล้องตามเงื่อนไขคืออะไร
การสอดคล้องตามเงื่อนไข ทำให้ชนิดข้อมูล generic สอดคล้องกับโปรโตคอลก็ต่อเมื่อพารามิเตอร์ชนิดข้อมูลของชนิดนั้นตรงตามข้อจำกัดบางประการ ตัวอย่างคลาสสิกคือ Array จะเป็น Equatable ก็ต่อเมื่อ Element ของมันเป็น Equatable
extension Array where Element: Equatable {
func allEqual(to x: Element) -> Bool {
allSatisfy { $0 == x }
}
}ตัวอย่างในตัว
ไลบรารีมาตรฐานใช้แนวคิดนี้อยู่แล้ว: [Int] เป็น Equatable เพราะ Int เป็นเช่นนั้น อาร์เรย์สองชุดจะเท่ากันเมื่อเปรียบเทียบสมาชิกทีละองค์ประกอบแล้วตรงกัน
let a = [1, 2, 3]
let b = [1, 2, 3]
print(a == b)การประกาศการสอดคล้องตามเงื่อนไข
เขียนส่วนขยายที่เพิ่มการสอดคล้องกับโปรโตคอลโดยใช้อนุประโยค where ในที่นี้ ตัวห่อจะสอดคล้องกับ Equatable ก็ต่อเมื่อชนิดของค่าที่ห่อไว้สอดคล้องด้วย
struct Pair<T> {
let first: T
let second: T
}
extension Pair: Equatable where T: Equatable {
static func == (l: Pair, r: Pair) -> Bool {
l.first == r.first && l.second == r.second
}
}
print(Pair(first: 1, second: 2) == Pair(first: 1, second: 2))เหตุใดข้อจำกัดจึงสำคัญ
หากไม่มีข้อจำกัด คอมไพเลอร์จะสร้าง == ให้โดยอัตโนมัติไม่ได้ เพราะการเปรียบเทียบค่าที่ห่อไว้จำเป็นต้องให้ค่านั้นสามารถเปรียบเทียบได้ อนุประโยค where จึงเป็นหลักประกันที่จำเป็นอย่างพอดี
struct Box<T> { let value: T }
extension Box: Equatable where T: Equatable {}
print(Box(value: "hi") == Box(value: "hi"))
print(Box(value: 5) == Box(value: 9))Codable ตามเงื่อนไข
คุณสามารถกำหนดให้สอดคล้องกับ Codable ตามเงื่อนไขได้ ภาชนะจะเข้ารหัสได้ก็ต่อเมื่อองค์ประกอบของมันเข้ารหัสได้เช่นกัน
struct Wrapper<T> { let payload: T }
extension Wrapper: Codable where T: Codable {}
let w = Wrapper(payload: 42)
let data = try! JSONEncoder().encode(w)
print(String(data: data, encoding: .utf8)!)ข้อจำกัดหลายรายการ
อนุประโยค where สามารถระบุข้อกำหนดหลายรายการโดยคั่นด้วยจุลภาคได้
struct Stack<T> { var items: [T] = [] }
extension Stack where T: Comparable {
func maxItem() -> T? { items.max() }
}
var s = Stack<Int>()
s.items = [3, 9, 1]
print(s.maxItem()!)CustomStringConvertible ตามเงื่อนไข
ทำให้ชนิดข้อมูลสามารถพิมพ์ได้ก็ต่อเมื่อสิ่งที่อยู่ภายในพิมพ์ได้เช่นกัน โดยประกอบคำอธิบายจาก elements
struct Labeled<T> { let label: String; let value: T }
extension Labeled: CustomStringConvertible where T: CustomStringConvertible {
var description: String { label + ": " + value.description }
}
print(Labeled(label: "Age", value: 30))การสอดคล้องตามเงื่อนไขแบบซ้อน
การสอดคล้องตามเงื่อนไขสามารถประกอบกันได้ ดังนั้นอาร์เรย์ของอาร์เรย์ของ Int จึงเป็น Equatable เพราะแต่ละชั้นเชื่อมต่อข้อจำกัดต่อกัน
let grid1 = [[1, 2], [3, 4]]
let grid2 = [[1, 2], [3, 4]]
print(grid1 == grid2)การจำกัดให้เป็นไปตามโปรโตคอลอื่น
อนุประโยค where สามารถกำหนดให้องค์ประกอบสอดคล้องกับโปรโตคอลที่คุณกำหนดเองได้ ซึ่งจะเปิดใช้ความสามารถที่สร้างขึ้นบนโปรโตคอลนั้น
protocol Priced { var price: Double { get } }
struct Item: Priced { let price: Double }
extension Array where Element: Priced {
var totalPrice: Double { reduce(0) { $0 + $1.price } }
}
print([Item(price: 1.5), Item(price: 2.5)].totalPrice)ข้อจำกัดชนิดข้อมูลเดียวกัน
คุณสามารถจำกัดชนิดข้อมูลที่เกี่ยวข้องให้เป็นชนิดข้อมูลเฉพาะด้วย == ในที่นี้ เมธอดจะใช้ได้เฉพาะกับอาร์เรย์ของ String เท่านั้น
extension Array where Element == String {
func joinedUpper() -> String {
map { $0.uppercased() }.joined(separator: "-")
}
}
print(["a", "b", "c"].joinedUpper())คอมไพเลอร์นำไปใช้อย่างไร
การสอดคล้องตามเงื่อนไขช่วยให้คอมไพเลอร์มอบประโยชน์ของโปรโตคอลได้เฉพาะเมื่อสิ่งเหล่านั้นถูกต้อง จึงทำให้โค้ด generic ปลอดภัยและนำกลับมาใช้ซ้ำได้มากที่สุด
struct Optional2<T> { let value: T? }
extension Optional2: Equatable where T: Equatable {
static func == (l: Optional2, r: Optional2) -> Bool { l.value == r.value }
}
print(Optional2(value: 1) == Optional2(value: 1))ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจของคุณเกี่ยวกับการสอดคล้องตามเงื่อนไข
ทบทวน
การสอดคล้องตามเงื่อนไข ใช้ extension Type: Protocol where ... เพื่อให้สอดคล้องกับโปรโตคอลก็ต่อเมื่อพารามิเตอร์ชนิดข้อมูลตรงตามข้อจำกัด คุณได้เห็นการใช้งานกับ Equatable, Codable และ CustomStringConvertible> โดยมีทั้งข้อจำกัดด้านโปรโตคอล ข้อจำกัดชนิดข้อมูลเดียวกัน (==) และการซ้อนกัน แนวคิดนี้ช่วยให้ชนิดข้อมูล generic ปลอดภัยและนำกลับมาใช้ซ้ำได้
คำถามที่พบบ่อย
บทเรียน “การสอดคล้องตามเงื่อนไข” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การสอดคล้องตามเงื่อนไข” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การสอดคล้องตามเงื่อนไข”
ทำให้สอดคล้องกับโพรโทคอลแบบทั่วไปเฉพาะเมื่อเป็นไปตามข้อจำกัด คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การสอดคล้องตามเงื่อนไข” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม
ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- โพรโทคอลในฐานะสัญญา
- การใช้งานเริ่มต้นในส่วนขยาย
- การประกอบโพรโทคอล
- การสอดคล้องตามเงื่อนไข