ลำดับของบล็อก 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- defer ทำงานอย่างไร
- ลำดับของบล็อก defer หลายบล็อก
- defer สำหรับการคืนทรัพยากร
- defer กับข้อผิดพลาดและการคืนค่าก่อนกำหนด