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

อนุประโยค where ในฟังก์ชัน

เพิ่มข้อจำกัดอย่างละเอียดให้ฟังก์ชันแบบทั่วไป

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

ก้าวข้ามข้อจำกัดพื้นฐาน

ข้อจำกัดอย่าง <T: Collection> อธิบายตัว T เอง แต่บางครั้งคุณจำเป็นต้องจำกัดชนิดข้อมูลที่เกี่ยวข้องของ T เช่น Element ซึ่งเป็นหน้าที่ของอนุประโยค where

func sumInts<C: Collection>(_ c: C) -> Int where C.Element == Int {
    c.reduce(0, +)
}
print(sumInts([1, 2, 3]))

ข้อกำหนดชนิดข้อมูลเดียวกัน

where C.Element == Int กำหนดให้องค์ประกอบของคอลเลกชันเป็น Int โดยตรง จึงสามารถทำงานที่เฉพาะกับจำนวนเต็มได้

func describe<C: Collection>(_ c: C) -> String where C.Element == Int {
    "Sum is " + String(c.reduce(0, +))
}
print(describe(Set([1, 2, 3])))

ข้อกำหนดด้านโปรโตคอลขององค์ประกอบ

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

func joinAll<C: Collection>(_ c: C) -> String
    where C.Element: CustomStringConvertible {
    c.map { $0.description }.joined(separator: ", ")
}
print(joinAll([1, 2, 3]))

where อยู่หลังลายเซ็น

อนุประโยค where อยู่ระหว่างชนิดค่าที่ส่งกลับกับเนื้อฟังก์ชัน ข้อจำกัดภายใน <> และอนุประโยค where จะทำงานร่วมกัน

func maxElement<C: Collection>(_ c: C) -> C.Element?
    where C.Element: Comparable {
    c.max()
}
print(maxElement([4, 9, 2])!)

การเชื่อมโยงพารามิเตอร์ชนิดข้อมูลสองตัว

อนุประโยค where สามารถเชื่อมโยงชนิดขององค์ประกอบจากเจเนอริกสองแบบที่แตกต่างกันด้วย == ได้

func combine<A: Collection, B: Collection>(_ a: A, _ b: B) -> [A.Element]
    where A.Element == B.Element {
    Array(a) + Array(b)
}
print(combine([1, 2], Set([3])))

เงื่อนไข where หลายรายการ

ระบุข้อกำหนดหลายรายการโดยคั่นด้วยจุลภาค เพื่อแสดงข้อจำกัดแบบผสม

func report<C: Collection>(_ c: C)
    where C.Element: Comparable, C.Element: CustomStringConvertible {
    if let m = c.max() { print("max:", m.description) }
}
report([5, 1, 9])

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

คุณสามารถเข้าถึงชนิดข้อมูลที่อยู่ลึกลงไปได้ เช่น กำหนดชนิดขององค์ประกอบขององค์ประกอบ เมื่อทำงานกับคอลเลกชัน nested

func flatten<C: Collection>(_ c: C) -> [Int]
    where C.Element: Collection, C.Element.Element == Int {
    c.flatMap { Array($0) }
}
print(flatten([[1, 2], [3]]))

where กับองค์ประกอบ Equatable

การกำหนดให้องค์ประกอบเป็น Equatable ช่วยให้คุณค้นหาภายในคอลเลกชัน generic ได้

func indexOf<C: Collection>(_ x: C.Element, in c: C) -> C.Index?
    where C.Element: Equatable {
    c.firstIndex(of: x)
}
if let i = indexOf(2, in: [1, 2, 3]) { print("found") }

เมธอด generic ที่ใช้ where

เมธอดภายในชนิดข้อมูล generic ก็ใช้ where ได้เช่นกัน โดยมักใช้เพื่อเพิ่มการทำงานเฉพาะสำหรับชนิดขององค์ประกอบบางประเภท

struct Wrap<T> {
    let items: [T]
    func total() -> Int where T == Int { items.reduce(0, +) }
}
print(Wrap(items: [1, 2, 3]).total())

ประโยชน์ด้านความอ่านง่าย

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

func first<C: Collection>(_ c: C) -> String
    where C.Element: CustomStringConvertible {
    c.first.map { $0.description } ?? "empty"
}
print(first([10, 20]))

where ในไลบรารีมาตรฐาน

เมธอดอย่าง joined() บนลำดับของลำดับใช้อนุประโยค where ภายใน เพื่อแสดงข้อกำหนดของเมธอดอย่างแม่นยำ

let nested = [[1, 2], [3, 4]]
print(Array(nested.joined()))

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

ทดสอบความเข้าใจของคุณเกี่ยวกับอนุประโยค where ในฟังก์ชัน

ทบทวน

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

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

บทเรียน “อนุประโยค where ในฟังก์ชัน” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “อนุประโยค where ในฟังก์ชัน”

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

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

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

บทเรียน “อนุประโยค where ในฟังก์ชัน” ใช้เวลานานแค่ไหน

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

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

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

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

  1. ข้อจำกัดของพารามิเตอร์ชนิด
  2. อนุประโยค where ในฟังก์ชัน
  3. การจำกัดชนิดที่เกี่ยวข้อง
  4. ซับสคริปต์และส่วนขยายแบบทั่วไป
← กลับไปที่ Swift Academy