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

รายการจับค่า — weak/unowned และการจับค่า

ใช้รายการจับค่าเพื่อควบคุมวิธีที่คลอสเชอร์จับการอ้างอิงและค่า: [weak self], unowned และภาพคงค่าของค่า เพื่อหลีกเลี่ยงวงจรการอ้างอิงและข้อผิดพลาดที่สังเกตได้ยาก

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

ทำไมต้องใช้รายการจับค่า

เป้าหมาย: ควบคุมสิ่งที่ และวิธีที่ closure จับค่า ใช้ [การอ้างอิงแบบอ่อน self] หรือ การอ้างอิงที่ไม่เป็นเจ้าของ เพื่อหลีกเลี่ยงวงจรการถือครอง และจับ ภาพรวมค่าตามช่วงเวลา เมื่อจำเป็น

การจับค่าแบบเข้มข้นเสี่ยงต่อการเกิดวงจร

closure ที่หลุดออกหรือถูกเก็บไว้จะถือครองค่าที่จับไว้ การจับ self แบบเข้มข้นในกรณีนี้อาจสร้าง วงจรการถือครอง ได้

class Owner {
    var name = "Owner"
    var onDone: (() -> Void)?

    func start() {
        // Strong capture of self can cause a cycle if onDone is stored:
        onDone = {
            print("Done by", self.name) // self captured strongly
        }
    }
}
var o: Owner? = Owner()
o?.start()
// If nothing nils onDone or o, both can keep each other alive.

รูปแบบการจับค่าแบบอ่อน

ใช้ [การอ้างอิงแบบอ่อน self] เพื่อตัดวงจร ภายในจะถือว่า self เป็นค่าเลือกได้ ให้แกะค่าด้วย ตรวจสอบและผูกค่า หรือการเชื่อมโยงแบบเลือกได้

class Owner2 {
    var name = "Owner2"
    var onDone: (() -> Void)?

    func start() {
        onDone = { [weak self] in
            guard let self = self else { return }  // safely unwrap optional self
            print("Done by", self.name)
        }
    }
}
let o2 = Owner2()
o2.start()
o2.onDone?()

การอ้างอิงที่ไม่เป็นเจ้าของ (ใช้อย่างระมัดระวัง)

การอ้างอิงที่ไม่เป็นเจ้าของ สมมติว่า self มีอายุยืนยาวกว่า closure และไม่ใช่ค่าเลือกได้ ใช้เฉพาะเมื่อแน่ใจว่าในเวลาที่เรียกใช้ ค่านั้นไม่สามารถเป็น nil ได้

class Owner3 {
    var onDone: (() -> Void)?
    func work() {
        onDone = { [unowned self] in
            // self must be alive when this runs; otherwise crash
            print("Owner3 still alive")
        }
    }
}
let o3 = Owner3()
o3.work()
o3.onDone?()

แนวคิดภาพรวมค่าตามช่วงเวลา

รายการจับค่าสามารถบันทึกภาพรวมของค่าได้ เช่น [n = count] หากไม่มีรายการจับค่า ค่าคงที่ let ภายในก็ยังถูกจับไว้ตั้งแต่ตอนสร้าง

var count = 0
let makeLogger: () -> () -> Void = {
    let snapshot = count     // captured by value at creation
    return {
        print("snapshot =", snapshot, "current =", count)
    }
}
count = 10
let logger = makeLogger()
count = 20
logger()   // snapshot = 10, current = 20

การผูกชื่อค่าในรายการจับค่า

ใช้รายการจับค่าเพื่อสร้างภาพรวมของค่าที่มีชื่อ เช่น [initial = total] ในเวลาที่สร้าง closure

var total = 5
let closure = { [initial = total] in
    print("initial:", initial, " now:", total)
}
total = 9
closure()   // initial uses captured value 5

เหตุผลที่ใช้การอ้างอิงแบบอ่อนกับ self

ตรวจสอบอย่างรวดเร็ว: เหตุใดจึงเพิ่ม [weak self] ให้กับ closure ที่ถูกเก็บไว้หรือหลุดออก

สรุปทบทวน

สรุปทบทวน: ใช้ [การอ้างอิงแบบอ่อน self] เพื่อตัดวงจร โดย self จะกลายเป็นค่าเลือกได้ ใช้ การอ้างอิงที่ไม่เป็นเจ้าของ เฉพาะเมื่อรับประกันอายุการใช้งาน และจับ ภาพรวมค่าตามช่วงเวลา ด้วยการผูกค่าในรายการจับ

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

บทเรียน “รายการจับค่า — weak/unowned และการจับค่า” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “รายการจับค่า — weak/unowned และการจับค่า”

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

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

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

บทเรียน “รายการจับค่า — weak/unowned และการจับค่า” ใช้เวลานานแค่ไหน

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

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

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

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

  1. พื้นฐานคลอสเชอร์และการจับค่า
  2. รายการจับค่า — weak/unowned และการจับค่า
  3. แบบ escaping กับไม่ escaping และออโตคลอสเชอร์
← กลับไปที่ Swift Academy