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

ข้อจำกัด (where) และการอนุมานชนิด

กำหนดข้อจำกัดให้โค้ดเจเนอริกด้วย where (เช่น ข้อจำกัด Equatable/Comparable หรือ Element) และดูวิธีที่ Swift อนุมานชนิดเจเนอริก ณ จุดเรียกใช้

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

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

เพิ่ม ข้อจำกัด เพื่อให้โค้ดเจเนอริกใช้การดำเนินการบางอย่างได้ เช่น == หรือ < จากนั้น การอนุมานชนิดข้อมูลของ Swift จะเลือกชนิดข้อมูลจริงขณะเรียกใช้

ข้อจำกัด Equatable

where T: Equatable อนุญาตให้ตรวจสอบความเท่ากันได้ หากไม่มีข้อจำกัดนี้ == จะใช้กับ T ใด ๆ ไม่ได้

// Find the first index of value in an array of T
func indexOf<T>(_ value: T, in array: [T]) -> Int? where T: Equatable {
    for (i, x) in array.enumerated() {
        if x == value { return i }        // allowed because T: Equatable
    }
    return nil
}
print(indexOf(3, in: [1,2,3,2]) ?? -1)     // 2
print(indexOf("b", in: ["a","b","c"]) ?? -1)  // 1

ข้อจำกัด Comparable

การใช้ข้อจำกัดอย่าง T: Comparable ทำให้ใช้การดำเนินการจัดลำดับ เช่น < ได้

// Return the minimum value of a collection when elements are Comparable
func minimum<T: Comparable>(_ xs: [T]) -> T? {
    guard var best = xs.first else { return nil }
    for x in xs.dropFirst() {
        if x < best { best = x }
    }
    return best
}
print(minimum([7,3,9]) ?? -1)    // 3
print(minimum(["b","a","c"]) ?? "?") // "a"

ส่วนขยายที่มี where

ใช้ where Element: ... เพื่อเพิ่ม API เฉพาะสำหรับชนิดของสมาชิกบางประเภทเท่านั้น (ในที่นี้คืออาร์เรย์ของ Equatable)

// Add a helper only when the array's Element is Equatable
extension Array where Element: Equatable {
    func removingDuplicates() -> [Element] {
        var seen: [Element] = []
        for x in self {
            if !seen.contains(x) { seen.append(x) }
        }
        return seen
    }
}
print([1,2,2,3].removingDuplicates())   // [1,2,3]

ข้อจำกัดหลายรายการ

รวมข้อจำกัดหลายรายการเข้าด้วยกัน โดยจำกัดทั้ง ชนิดเจเนอริก และ ชนิดที่เกี่ยวข้อง (เช่น S.Element: Equatable)

// Require both Sequence and Equatable elements; force same-type relationship
func allEqual<S>(_ s: S) -> Bool
where S: Sequence, S.Element: Equatable {
    var it = s.makeIterator()
    guard let first = it.next() else { return true }
    while let v = it.next() { if v != first { return false } }
    return true
}
print(allEqual([2,2,2]))   // true
print(allEqual([1,2,1]))   // false

การอนุมานในการใช้งานจริง

Swift อนุมานพารามิเตอร์เจเนอริกจากอาร์กิวเมนต์และบริบท จึงแทบไม่ต้องระบุ <T> อย่างชัดเจน

// Inference: compiler deduces concrete types
let i = indexOf(10, in: [5,10,15])   // T is Int
let j = minimum(["z","x"])           // T is String
print(i ?? -1, j ?? "")

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

ตรวจสอบอย่างรวดเร็ว: ประโยค where ทำหน้าที่อะไร

ทบทวน

ทบทวน: จำกัดเจเนอริกด้วย where (เช่น T: Equatable, Element: Comparable) และอาศัย การอนุมานชนิดข้อมูลของ Swift เพื่อเลือกชนิดข้อมูลจริงขณะเรียกใช้

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

บทเรียน “ข้อจำกัด (where) และการอนุมานชนิด” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ข้อจำกัด (where) และการอนุมานชนิด”

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

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

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

บทเรียน “ข้อจำกัด (where) และการอนุมานชนิด” ใช้เวลานานแค่ไหน

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

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

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

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

  1. ฟังก์ชันและชนิดเจเนอริก
  2. ข้อจำกัด (where) และการอนุมานชนิด
  3. อัลกอริทึมเจเนอริกบนคอลเลกชัน
← กลับไปที่ Swift Academy