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

some P (ชนิดผลลัพธ์แบบไม่เปิดเผย): ซ่อนชนิดรูปธรรม

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

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

เหตุผลที่ใช้ประเภทผลลัพธ์แบบไม่เปิดเผยชนิด

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

  • ห่อหุ้มรายละเอียดโดยไม่สูญเสียประสิทธิภาพแบบคงที่
  • เหมาะอย่างยิ่งสำหรับโรงงานสร้างค่าและส่วนติดต่อที่คล้าย DSL

โรงงานสร้างค่าแบบไม่เปิดเผยชนิดพื้นฐาน

makeUnitCircle() คืนค่าเป็น รูปร่างแบบไม่เปิดเผยชนิด ผู้เรียกสามารถเรียกใช้ area() ได้ แต่ไม่สามารถพึ่งพาชนิดรูปธรรมได้

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 }
}

// Opaque factory: callers know it's a Shape, not which one
func makeUnitCircle() -> some Shape {
    Circle(r: 1.0)    // concrete type is hidden
}

let sh = makeUnitCircle()
print(String(format: "%.2f", sh.area()))  // 3.14

ตายตัวสำหรับแต่ละฟังก์ชัน

ชนิดที่ซ่อนอยู่จะ ตายตัวสำหรับแต่ละฟังก์ชัน ฟังก์ชันอีกตัวที่คืนค่า some Shape อาจซ่อนชนิดรูปธรรมที่ แตกต่างกัน ได้

// Each function using "some Shape" chooses one hidden concrete type.
// Within the same function, it must always be the same concrete type.
func makeSquare(side: Double) -> some Shape {
    Square(s: side)   // fixed to Square for this function
}

let a = makeUnitCircle()
let b = makeUnitCircle()
print(a.area() == b.area())  // true for two unit circles

let q = makeSquare(side: 2)
print(q.area())              // 4.0

มีชนิดที่ซ่อนอยู่ได้เพียงชนิดเดียว

กฎ: ฟังก์ชันที่คืนผลลัพธ์แบบไม่เปิดเผยชนิดต้องคืนชนิดรูปธรรม เดียวกัน ในทุกเส้นทางการทำงาน แขนงต่างชนิดกัน → ข้อผิดพลาดขณะคอมไพล์

// ❌ This would NOT compile, because different branches return different concrete types:
// func makeShape(flag: Bool) -> some Shape {
//     if flag {
//         return Circle(r: 1)
//     } else {
//         return Square(s: 1) // error: underlying type must be the same
//     }
// }
// Rule: an opaque-returning function must always produce the same concrete type.

ชนิดผลลัพธ์แบบไม่เปิดเผยชนิดร่วมกับเจเนอริก

ผลลัพธ์แบบไม่เปิดเผยชนิดสามารถประกอบร่วมกับเจเนอริกได้ ผู้เรียกจะเห็นเป็น Shape ขณะที่คุณยังคงซ่อนการนำ Scaled<Circle> ไปใช้ไว้เป็นส่วนตัว

// A generic decorator that also conforms to Shape
struct Scaled<S: Shape>: Shape {
    let base: S
    let k: Double
    func area() -> Double { base.area() * k * k }
}

// Factory still hides the concrete generic type
func makeScaledUnitCircle(k: Double) -> some Shape {
    Scaled(base: Circle(r: 1.0), k: k)
}

let s1 = makeScaledUnitCircle(k: 2)
print(s1.area())  // 4 * π

เมื่อใดควรเลือกชนิดแบบไม่เปิดเผย

ใช้ชนิดแบบไม่เปิดเผยเมื่อ:

  • คุณต้องการ ซ่อนรายละเอียดการนำไปใช้ แต่ยังคงการตรวจชนิดแบบคงที่
  • ส่วนติดต่อควรคืนมุมมองในรูปโปรโตคอล (เช่น Shape) โดยไม่เปิดเผยชนิดรูปธรรม
  • คุณสร้างกระบวนการทำงานต่อเนื่อง/DSLที่เชื่อมต่อตัวสร้างหลายตัวโดยยังคงเป็นเจเนอริก

(ในบทเรียนถัดไป คุณจะเปรียบเทียบกับชนิดเอ็กซิสเทนเชียล)

คำจำกัดความของผลลัพธ์แบบไม่เปิดเผยชนิด

ตรวจสอบสั้น ๆ: some P รับประกันอะไร

ทบทวน

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

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

บทเรียน “some P (ชนิดผลลัพธ์แบบไม่เปิดเผย): ซ่อนชนิดรูปธรรม” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “some P (ชนิดผลลัพธ์แบบไม่เปิดเผย): ซ่อนชนิดรูปธรรม”

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

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

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

บทเรียน “some P (ชนิดผลลัพธ์แบบไม่เปิดเผย): ซ่อนชนิดรูปธรรม” ใช้เวลานานแค่ไหน

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

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

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

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

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