การเลือกระหว่าง some, any และเจเนอิกส์
เลือกใช้ เจเนอิกส์ สำหรับการกำหนดชนิดแบบสถิตที่เป็นชนิดเดียวกัน ใช้ some P เพื่อซ่อนชนิดรูปธรรมที่ตายตัว และใช้ any P สำหรับพหุรูปแบบที่มีชนิดหลากหลาย
การเลือกระหว่าง 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- some P (ชนิดผลลัพธ์แบบไม่เปิดเผย): ซ่อนชนิดรูปธรรม
- any P (ชนิดอัตถิภาวะ): ข้อแลกเปลี่ยนและการเรียกแบบพลวัต
- การเลือกระหว่าง some, any และเจเนอิกส์