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

defer สำหรับการคืนทรัพยากร

ปิดไฟล์และคืนทรัพยากรได้อย่างน่าเชื่อถือ

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

ปัญหาการเก็บกวาด

ทรัพยากรต่าง ๆ เช่น ไฟล์ ล็อก หรือการเชื่อมต่อต้องได้รับการปล่อย การลืมปล่อยในเส้นทางการทำงานบางเส้นทางจะทำให้เกิดการรั่วไหล

func work() {
    print("acquire resource")
    print("use resource")
    print("release resource")
}
work()

defer รับประกันการปล่อยทรัพยากร

การใส่การปล่อยทรัพยากรไว้ใน defer รับประกันว่าการปล่อยจะทำงานไม่ว่าฟังก์ชันจะสิ้นสุดอย่างไร

func work() {
    print("acquire resource")
    defer { print("release resource") }
    print("use resource")
}
work()

จำลองตัวจัดการไฟล์

ในที่นี้โครงสร้างแบบง่ายจำลองการเปิดและการปิด โดย defer รับประกันว่าจะเรียก close เสมอ

struct File {
    let name: String
    func close() { print("closed", name) }
}
func readFile() {
    let f = File(name: "data.txt")
    defer { f.close() }
    print("reading", f.name)
}
readFile()

การรับและการปล่อยล็อก

จำลองล็อกโดยรับล็อกก่อน จากนั้นเลื่อนการปล่อยไว้ด้วย defer เพื่อให้ส่วนวิกฤตถูกปลดล็อกเสมอ

func critical() {
    print("lock acquired")
    defer { print("lock released") }
    print("critical section work")
}
critical()

การเก็บกวาดถัดจากการตั้งค่า

การวางการเก็บกวาดไว้ทันทีหลังการตั้งค่าทำให้เห็นคู่ที่สัมพันธ์กันได้ชัดเจนและลืมได้ยาก

func session() {
    print("connect")
    defer { print("disconnect") }
    print("send request")
    print("receive response")
}
session()

ทรัพยากรหลายรายการ

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

func transaction() {
    print("open connection")
    defer { print("close connection") }
    print("begin transaction")
    defer { print("commit transaction") }
    print("run query")
}
transaction()

การรีเซ็ตตัวนับ

defer สามารถคืนสถานะเดิมได้ เช่น รีเซ็ตแฟล็กเมื่อขอบเขตสิ้นสุด

func tracked() {
    var active = true
    defer { active = false; print("active reset to", active) }
    print("active is", active)
}
tracked()

การหลีกเลี่ยงโค้ดซ้ำ

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

func validate(_ ok: Bool) {
    print("start")
    defer { print("cleanup done once") }
    if !ok {
        print("invalid")
        return
    }
    print("valid")
}
validate(false)

การเก็บกวาดพร้อมค่าที่คำนวณ

defer สามารถบันทึกการวัดค่าท้ายสุดได้ เช่น มีรายการที่ประมวลผลไปแล้วกี่รายการ

func batch() {
    var processed = 0
    defer { print("processed", processed, "items") }
    for _ in 1...3 { processed += 1 }
}
batch()

การคืนสถานะชั่วคราว

ใช้ defer เพื่อเปลี่ยนการตั้งค่าชั่วคราว แล้วคืนค่าการตั้งค่าเดิมได้อย่างมั่นใจ

func withVerbose() {
    var verbose = false
    verbose = true
    defer { verbose = false; print("verbose restored:", verbose) }
    print("verbose during work:", verbose)
}
withVerbose()

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

เมื่อใดก็ตามที่คุณรับสิ่งที่ต้องปล่อย ให้ลงทะเบียนการปล่อยนั้นด้วย defer ในบรรทัดถัดไปทันที

func handle() {
    print("acquire")
    defer { print("release") }
    print("process")
}
handle()

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

ทดสอบการใช้ defer สำหรับการเก็บกวาด

สรุปทบทวน

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

func work() {
    print("acquire")
    defer { print("release") }
    print("use")
}
work()

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

บทเรียน “defer สำหรับการคืนทรัพยากร” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “defer สำหรับการคืนทรัพยากร”

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

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

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

บทเรียน “defer สำหรับการคืนทรัพยากร” ใช้เวลานานแค่ไหน

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

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

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

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

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