Swift Academy · บทเรียน

การเลือกระหว่าง some, any และเจเนอิกส์

เลือกใช้ เจเนอิกส์ สำหรับการกำหนดชนิดแบบสถิตที่เป็นชนิดเดียวกัน ใช้ some P เพื่อซ่อนชนิดรูปธรรมที่ตายตัว และใช้ any P สำหรับพหุรูปแบบที่มีชนิดหลากหลาย

บทเรียน 3 จาก 38 ขั้นตอน

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

ควรใช้ชนิดใดเมื่อใด

หลักทั่วไป:

  • เจเนอริก: ชนิดรูปธรรมเดียวกันต่อการเรียกใช้หนึ่งครั้ง ตรวจสอบขณะคอมไพล์ได้ดีที่สุดและมีประสิทธิภาพสูง
  • ชนิดผลลัพธ์แบบไม่เปิดเผย: ซ่อนชนิดผลลัพธ์รูปธรรม ซึ่งตายตัวสำหรับแต่ละฟังก์ชัน
  • ชนิดเอ็กซิสเทนเชียล: ผสมค่าที่สอดคล้องกับโปรโตคอลได้ ต่างชนิด และเรียกใช้แบบไดนามิก

เจเนอริก: ชนิดเดียวกัน

เจเนอริกเหมาะอย่างยิ่งสำหรับข้อมูลชนิดเดียวกันและการปรับปรุงประสิทธิภาพ (การเรียกใช้แบบคงที่และการแทรกโค้ดในจุดเรียกใช้)

protocol Shape { func area() -> Double }

struct Circle: Shape { let r: Double; func area() -> Double { .pi * r * r } }
struct Square: Shape { let s: Double; func area() -> Double { s * s } }

// Generic: one concrete Shape type per call site (homogeneous)
func totalAreaGeneric<S: Sequence, T: Shape>(_ xs: S) -> Double where S.Element == T {
    xs.reduce(0) { $0 + $1.area() }
}
print(totalAreaGeneric([Circle(r:1), Circle(r:2)]))  // OK
// totalAreaGeneric([Circle(r:1), Square(s:2)])      // ❌ different types

แบบไม่เปิดเผย: ซ่อนแต่ตายตัว

ชนิดผลลัพธ์แบบไม่เปิดเผยคืนชนิดที่ตายตัวแต่ซ่อนไว้ เหมาะอย่างยิ่งเมื่อคุณต้องการการห่อหุ้มโดยไม่สูญเสียประสิทธิภาพแบบคงที่

// Opaque factory hides the concrete type while guaranteeing Shape
func unitShape(flag: Bool) -> some Shape {
    // Must return the SAME underlying type on all paths; pick one.
    Circle(r: 1)
}
let s = unitShape(flag: true)
print(String(format: "%.2f", s.area()))  // 3.14

ชนิดเอ็กซิสเทนเชียล: ต่างชนิด

ชนิดเอ็กซิสเทนเชียลช่วยให้ใช้ค่าต่างชนิดในคอลเลกชันหรือตัวแปรเดียวกันได้ เมธอดจะถูกเรียกใช้แบบไดนามิกผ่านส่วนติดต่อของโปรโตคอล

// Existential: store mixed conformers
let mixed: [any Shape] = [Circle(r: 1), Square(s: 2)]
let sum = mixed.reduce(0) { $0 + $1.area() }   // dynamic dispatch
print(String(format: "%.2f", sum))

เปรียบเทียบรูปแบบของส่วนติดต่อ

เลือกรูปแบบที่ต้องการเปิดเผย:

  • เจเนอริก: ผู้เรียกควบคุมชนิดรูปธรรม
  • แบบไม่เปิดเผย: คุณซ่อนชนิด ซึ่งตายตัวสำหรับแต่ละฟังก์ชัน
  • ชนิดเอ็กซิสเทนเชียล: คุณอาจเปลี่ยนชนิดรูปธรรมได้ขณะทำงาน
// Three API shapes for the same idea: "make a Shape"

// 1) Generic return — exposes concrete type to caller
func makeGeneric<T: Shape>(_ t: T) -> T { t }

// 2) Opaque return — hides concrete type but fixed
func makeOpaqueCircle() -> some Shape { Circle(r: 1) }

// 3) Existential return — can return any conformer
func makeExistential(_ big: Bool) -> any Shape { big ? Square(s: 3) : Circle(r: 1) }

let g: Circle = makeGeneric(Circle(r: 2))      // caller knows concrete type
let o = makeOpaqueCircle()                      // caller sees only Shape
let e = makeExistential(true)                   // could be Circle or Square at runtime
print(g.area(), o.area(), e.area())

สรุปย่อ

แนวทาง:

  • เลือกใช้เจเนอริกเพื่อประสิทธิภาพและการตรวจชนิดที่เข้มงวดเมื่อข้อมูลเป็นชนิดเดียวกัน
  • ใช้ชนิดผลลัพธ์แบบไม่เปิดเผยเพื่อซ่อนชนิดผลลัพธ์และรักษาความเสถียรของส่วนติดต่อ
  • ใช้ชนิดเอ็กซิสเทนเชียลสำหรับคอลเลกชันลักษณะปลั๊กอินหรือคอลเลกชันต่างชนิด
  • หลีกเลี่ยงชนิดเอ็กซิสเทนเชียลสำหรับโปรโตคอลที่มีชนิดที่เกี่ยวข้องหรือการอ้างอิงตัวเอง เว้นแต่จะใช้การลบชนิด

ตรวจสอบการตัดสินใจ: เลือกแบบไม่เปิดเผย/เอ็กซิสเทนเชียล/เจเนอริก

ตรวจสอบสั้น ๆ: ตัวเลือกใดซ่อนชนิดผลลัพธ์รูปธรรมที่ตายตัวไว้เบื้องหลังโปรโตคอล P

ทบทวน

ทบทวน:

  • เจเนอริก = ชนิดเดียวกัน เร็วที่สุด และเป็นแบบคงที่มากที่สุด
  • ชนิดผลลัพธ์แบบไม่เปิดเผย = ซ่อนชนิดรูปธรรม ซึ่งตายตัวสำหรับแต่ละฟังก์ชัน
  • ชนิดเอ็กซิสเทนเชียล = ต่างชนิด และเรียกใช้แบบไดนามิก
เริ่มต้นได้ฟรี

เรียนรู้ Swift ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
122
บทเรียน
409

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

บทเรียน “การเลือกระหว่าง some, any และเจเนอิกส์” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การเลือกระหว่าง some, any และเจเนอิกส์”

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

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

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

บทเรียน “การเลือกระหว่าง some, any และเจเนอิกส์” ใช้เวลานานแค่ไหน

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

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

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

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

  1. some P (ชนิดผลลัพธ์แบบไม่เปิดเผย): ซ่อนชนิดรูปธรรม
  2. any P (ชนิดอัตถิภาวะ): ข้อแลกเปลี่ยนและการเรียกแบบพลวัต
  3. การเลือกระหว่าง some, any และเจเนอิกส์
← กลับไปที่ Swift Academy