รายการจับค่า — 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐานคลอสเชอร์และการจับค่า
- รายการจับค่า — weak/unowned และการจับค่า
- แบบ escaping กับไม่ escaping และออโตคลอสเชอร์