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

การสอดคล้องตามเงื่อนไข

ทำให้สอดคล้องกับโพรโทคอลแบบทั่วไปเฉพาะเมื่อเป็นไปตามข้อจำกัด

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

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

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