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

ลำดับของบล็อก defer หลายบล็อก

ทำความเข้าใจลำดับการทำงานย้อนกลับของ defer

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

คำสั่ง defer หลายรายการ

ขอบเขตหนึ่งสามารถมีบล็อก defer ได้หลายบล็อก โดยทั้งหมดจะทำงานเมื่อออกจากขอบเขต

func demo() {
    defer { print("A") }
    defer { print("B") }
    print("body")
}
demo()

ลำดับย้อนกลับ (LIFO)

บล็อกที่เลื่อนการทำงานจะทำงานตามลำดับการประกาศแบบย้อนกลับ โดยรายการที่ประกาศล่าสุดจะทำงานก่อน

func order() {
    defer { print("1") }
    defer { print("2") }
    defer { print("3") }
    print("start")
}
order()

เหตุผลที่ใช้ LIFO

ลำดับแบบ LIFO สอดคล้องกับการซ้อนกันของการตั้งค่าและการเก็บกวาด กล่าวคือการตั้งค่าล่าสุดจะถูกย้อนกลับก่อน

func resources() {
    print("open A")
    defer { print("close A") }
    print("open B")
    defer { print("close B") }
    print("use both")
}
resources()

แบบจำลองทางความคิดเป็นกองซ้อน

ให้คิดว่าคำสั่ง defer เป็นกองซ้อน แต่ละรายการจะเพิ่มงานเข้าไป และงานเหล่านั้นจะถูกนำออกตามลำดับย้อนกลับเมื่อขอบเขตสิ้นสุด

func stack() {
    defer { print("pop first-declared last") }
    defer { print("pop last-declared first") }
    print("push done")
}
stack()

คำสั่ง defer กับสถานะเฉพาะที่

คำสั่ง defer แต่ละรายการจะจับตัวแปรโดยรอบ และเห็นค่าท้ายสุดของตัวแปรเหล่านั้นเมื่อทำงาน

func state() {
    var x = 1
    defer { print("x is", x) }
    x = 42
}
state()

คำสั่ง defer ในลูป

ภายในลูป การวนซ้ำแต่ละครั้งจะลงทะเบียนและทำงานกับคำสั่ง defer ของตนเองตามลำดับ LIFO เมื่อสิ้นสุดการวนซ้ำนั้น

for i in 1...2 {
    defer { print("late", i) }
    defer { print("early", i) }
    print("body", i)
}

ขอบเขตที่ซ้อนกัน

คำสั่ง defer จะทำงานเมื่อขอบเขตของตนเองสิ้นสุด ดังนั้น defer ของบล็อกด้านในจะทำงานก่อนของบล็อกด้านนอก

func nested() {
    defer { print("outer defer") }
    do {
        defer { print("inner defer") }
        print("inner body")
    }
    print("outer body")
}
nested()

การเก็บกวาดที่คาดเดาได้

ลำดับ LIFO ทำให้คู่การเปิดและปิดที่จับคู่กันปิดลงตามลำดับที่ถูกต้องโดยธรรมชาติ

func files() {
    print("open log")
    defer { print("flush log") }
    print("open db")
    defer { print("disconnect db") }
    print("transaction")
}
files()

การอ่านลำดับการทำงาน

หากต้องการคาดเดาผลลัพธ์ ให้อ่านคำสั่ง defer จากล่างขึ้นบน โดย defer รายการสุดท้ายในขอบเขตจะพิมพ์ผลลัพธ์ก่อน

func quiz() {
    defer { print("one") }
    defer { print("two") }
    print("body runs first")
}
quiz()

การทำงานร่วมกับการคืนค่า

คำสั่ง defer ที่ลงทะเบียนไว้ทั้งหมดจะยังทำงานตามลำดับ LIFO แม้ฟังก์ชันจะคืนค่าก่อนกำหนด

func early(_ skip: Bool) {
    defer { print("cleanup 1") }
    defer { print("cleanup 2") }
    if skip { return }
    print("full body")
}
early(true)

แนวปฏิบัติที่ดี

ประกาศการเก็บกวาดแต่ละรายการทันทีหลังการตั้งค่าของรายการนั้น แล้ววางใจให้ลำดับ LIFO คลายรายการเหล่านั้นอย่างถูกต้อง

func pattern() {
    print("acquire 1")
    defer { print("release 1") }
    print("acquire 2")
    defer { print("release 2") }
    print("work")
}
pattern()

ตรวจสอบอย่างรวดเร็ว

ทดสอบลำดับการทำงานของ defer

สรุปทบทวน

บล็อก defer หลายบล็อกจะทำงานตามลำดับย้อนกลับ (LIFO) เมื่อออกจากขอบเขต โดยรายการที่ประกาศล่าสุดจะทำงานก่อน วิธีนี้จะคลายคู่การตั้งค่าและการเก็บกวาดที่ซ้อนกันตามลำดับที่ถูกต้องโดยธรรมชาติ แม้จะคืนค่าก่อนกำหนด

func demo() {
    defer { print("1") }
    defer { print("2") }
    print("body")
}
demo()

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

บทเรียน “ลำดับของบล็อก defer หลายบล็อก” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ลำดับของบล็อก defer หลายบล็อก”

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

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

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

บทเรียน “ลำดับของบล็อก defer หลายบล็อก” ใช้เวลานานแค่ไหน

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

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

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

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

  1. defer ทำงานอย่างไร
  2. ลำดับของบล็อก defer หลายบล็อก
  3. defer สำหรับการคืนทรัพยากร
  4. defer กับข้อผิดพลาดและการคืนค่าก่อนกำหนด
← กลับไปที่ Swift Academy