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

เมื่อใดควรใช้ existential (any P) กับเจเนอริก

เลือกใช้ระหว่าง any P (ชนิด existential) กับ generics : การจัดเก็บชนิดต่างกันและพฤติกรรมแบบไดนามิก เทียบกับการปรับให้เฉพาะทางขณะคอมไพล์และการรับประกันแบบคงที่

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

เอ็กซิสเทนเชียลเทียบกับเจเนอริกส์

เอ็กซิสเทนเชียล (any P) เก็บค่าที่มี ชนิดรูปธรรมที่ไม่ทราบแน่ชัด และสอดคล้องกับโปรโตคอล ส่วน เจเนอริกส์ (<T: P>) จะคงชนิดรูปธรรมไว้ขณะคอมไพล์เพื่อการทำให้เฉพาะทาง

การตั้งค่าโปรโตคอล

โปรโตคอลที่ ไม่มีชนิดที่เกี่ยวข้อง ใช้เป็นเอ็กซิสเทนเชียล any P และเป็นข้อจำกัดของเจเนอริกส์ได้ง่าย

protocol Animal {
    func speak() -> String
}
struct Dog: Animal { func speak() -> String { "woof" } }
struct Cat: Animal { func speak() -> String { "meow" } }

อาร์เรย์ต่างชนิด

ใช้ [any Animal] เพื่อเก็บชนิดที่สอดคล้องต่างกันไว้ด้วยกัน และเรียกใช้ได้เฉพาะส่วนติดต่อของโปรโตคอล

let zoo: [any Animal] = [Dog(), Cat()]   // heterogeneous array
for a in zoo { print(a.speak()) }              // "woof", "meow"

การทำให้เฉพาะทางด้วยเจเนอริกส์

เจเนอริกส์ จะคงชนิดรูปธรรม (T) ไว้ ทำให้ปรับปรุงประสิทธิภาพได้มากขึ้นและตรวจสอบได้เข้มงวดขึ้นขณะคอมไพล์

// Generic version — compiler specializes for each concrete type
func shout<T: Animal>(_ a: T) {
    // Can inline/specialize based on concrete T
    print(a.speak().uppercased())
}
shout(Dog()) // WOOF
shout(Cat()) // MEOW

ข้อจำกัดของ PAT

โปรโตคอลที่มี ชนิดที่เกี่ยวข้อง ใช้เป็นเอ็กซิสเทนเชียลทั่วไปได้ไม่ดี หากจำเป็นต้องใช้ชนิดที่เกี่ยวข้อง ควรเลือกใช้ เจเนอริกส์ หรือ การลบชนิด (เช่น AnySequence)

protocol Container {
    associatedtype Item
    func get(_ i: Int) -> Item
}
// Storing as `any Container` loses the concrete Item.
// You can't use Item directly without additional constraints or type erasure.

ควรเลือกแบบใด

ให้เลือกดังนี้:

  • any P เมื่อต้องการจัดเก็บค่าต่างชนิด หรือพฤติกรรมแบบไดนามิกผ่านส่วนติดต่อของโปรโตคอลเท่านั้น
  • เจเนอริกส์ เมื่อต้องการ ชนิดแบบสแตติก การปรับปรุงประสิทธิภาพที่ดีขึ้น หรือต้องเชื่อมโยงชนิดหลายชนิดเข้าด้วยกัน (เช่น Item เดียวกัน)
  • สำหรับ PAT ที่ต้องใช้ Item ให้ใช้ เจเนอริกส์ หรือเพิ่ม การลบชนิด

any P เทียบกับเจเนอริกส์

ตรวจสอบสั้น ๆ: ควรเลือกใช้ any P เมื่อใด

สรุป

สรุป: ใช้ any P สำหรับชนิดที่สอดคล้องต่างกันและพฤติกรรมแบบไดนามิก ใช้ เจเนอริกส์ สำหรับการทำให้เฉพาะทางขณะคอมไพล์ และเมื่อชนิดที่เกี่ยวข้องหรือความสัมพันธ์ระหว่างชนิดมีความสำคัญ

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

บทเรียน “เมื่อใดควรใช้ existential (any P) กับเจเนอริก” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “เมื่อใดควรใช้ existential (any P) กับเจเนอริก”

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

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

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

บทเรียน “เมื่อใดควรใช้ existential (any P) กับเจเนอริก” ใช้เวลานานแค่ไหน

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

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

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

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

  1. associatedtype และโปรโตคอลเจเนอริก
  2. รูปแบบการลบชนิด (AnySequence/AnyIterator)
  3. เมื่อใดควรใช้ existential (any P) กับเจเนอริก
← กลับไปที่ Swift Academy