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

รูปแบบการลบชนิด (AnySequence/AnyIterator)

ใช้ AnySequence และ AnyIterator เพื่อลบชนิดของลำดับ/ตัววนซ้ำรูปธรรม ทำให้ API ส่งกลับ “ลำดับของ T” ได้โดยไม่เปิดเผยการนำไปใช้

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

เหตุใดจึงต้องลบชนิด

การลบชนิดซ่อนชนิดข้อมูลจริงไว้หลังตัวห่อที่มีรูปแบบคงที่ ด้วย AnySequence / AnyIterator คุณสามารถส่งคืน “ลำดับของสมาชิก” ได้โดยไม่เปิดเผยโครงสร้างภายใน

ข้อจำกัด

Sequence มีชนิดที่เกี่ยวข้อง (Element) ดังนั้นจึงไม่สามารถใช้โพรโทคอลเปล่าเป็นชนิดค่าที่เป็นรูปธรรมได้ เราจึงต้องใช้ตัวห่อ

// Goal: return "some Sequence<Int>"
// This won't compile as a stored value type:
// let s: Sequence = [1,2,3]   // Protocol with associated types
// Instead, erase the type to AnySequence<Int>.

ตัวห่อ AnySequence

AnySequence ห่อลำดับที่เป็นรูปธรรมใด ๆ (Array, Set หรือชนิดที่กำหนดเอง) และเปิดเผยชนิดที่เป็นแบบเดียวกัน เช่น AnySequence<Int>

// Build an AnySequence<Int> from an Array
let a = [1, 2, 3]
let seq1: AnySequence<Int> = AnySequence(a)
// Consume like any sequence
for x in seq1 { print(x, terminator: " ") }
print("")

ตัวห่อ AnyIterator

AnyIterator ห่อคลอสเชอร์ที่สร้างสมาชิกขึ้นมา ห่อมันด้วย AnySequence เพื่อเปิดเผยลำดับทั้งหมด

// Create an AnyIterator<Int> by hand
var i = 0
let it = AnyIterator<Int> {
    // Return next number or nil to stop
    guard i < 3 else { return nil }
    defer { i += 1 }
    return i
}
let seq2 = AnySequence(it)
for x in seq2 { print(x, terminator: " ") }  // 0 1 2
print("")

ชนิดผลลัพธ์แบบเดียวกัน

การลบชนิดทำให้ฟังก์ชันหนึ่งส่งคืน การใช้งานที่แตกต่างกันภายใต้ชนิดผลลัพธ์คงที่เพียงชนิดเดียว (AnySequence<Int>)

// Return a sequence of Int without exposing concrete type
func numbers(flag: Bool) -> AnySequence<Int> {
    if flag {
        // Array-based
        return AnySequence([10, 20, 30])
    } else {
        // Lazy generated with AnyIterator
        var n = 1
        let it = AnyIterator<Int> {
            guard n <= 3 else { return nil }
            defer { n += 1 }
            return n * 100
        }
        return AnySequence(it)
    }
}

for x in numbers(flag: true)  { print(x, terminator: " ") }  // 10 20 30
print("")
for x in numbers(flag: false) { print(x, terminator: " ") }  // 100 200 300
print("")

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

ควรใช้การลบชนิดเมื่อ:

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

หมายเหตุ: ควรใช้ เจเนอริกส์ ภายในโมดูลเพื่อประสิทธิภาพและความชัดเจน และใช้ AnySequence/AnyIterator ที่ขอบเขตส่วนติดต่อเมื่อจำเป็น

จุดประสงค์ของ AnySequence

ตรวจสอบสั้น ๆ: AnySequence<T> ให้อะไรแก่คุณ

สรุป

สรุป: ห่อลำดับ/ตัววนซ้ำที่เป็นรูปธรรมด้วย AnySequence / AnyIterator เพื่อลบชนิด และส่งคืน “ลำดับของ T” จากส่วนติดต่อโปรแกรมที่ยืดหยุ่น

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

บทเรียน “รูปแบบการลบชนิด (AnySequence/AnyIterator)” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “รูปแบบการลบชนิด (AnySequence/AnyIterator)”

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

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

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

บทเรียน “รูปแบบการลบชนิด (AnySequence/AnyIterator)” ใช้เวลานานแค่ไหน

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

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

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

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

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