Swift Academy · บทเรียน

รายการจับค่าของโคลสเชอร์และ [weak self]

ใช้รายการจับค่าเพื่อป้องกันไม่ให้โคลสเชอร์จับอ็อบเจ็กต์แบบการอ้างอิงเข้มแข็ง

บทเรียน 4 จาก 412 ขั้นตอน

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

ยินดีต้อนรับ

คลอสเชอร์จะจับตัวแปรจากขอบเขตโดยรอบ รายการจับค่า (`[weak self]`, `[unowned self]`, `[value]`) จะควบคุมวิธีการจับค่าเหล่านั้นอย่างละเอียด

การจับค่าแบบ strong เริ่มต้น

```swift var name = "Alice" let greet = { print("Hello, \(name)") } name = "Bob" greet() // "Hello, Bob" — closure sees current value ``` ตามค่าเริ่มต้น คลอสเชอร์จะจับ *การอ้างอิง* ไปยังตัวแปร

พื้นฐานรายการจับค่า

```swift var count = 10 let snapshot = { [count] in print(count) } // captures value count = 99 snapshot() // 10 — snapshot of count at capture time ``` การระบุชนิดค่าไว้ใน `[]` จะคัดลอกค่าขณะที่สร้างคลอสเชอร์

รูปแบบ [weak self]

```swift class API { func fetch(completion: @escaping () -> Void) { ... } } class VC { func load() { api.fetch { [weak self] in guard let self else { return } // self might be nil by now self.updateUI() } } } ```

guard let self พร้อมอายุการใช้งานที่ขยายออกไป

Swift 5.3 ขึ้นไป: ผูก `self` ใหม่ภายใน guard ได้โดยไม่ต้องสร้างชื่อซ้ำ: ```swift { [weak self] in guard let self else { return } // 'self' is now strong within this block doA() doB() doC() } ```

[unowned self] ใช้เมื่อใดจึงปลอดภัย

```swift button.addTarget(self, action: #selector(tap), for: .touchUpInside) // If the button's closure is guaranteed not to outlive self: let action: () -> Void = { [unowned self] in self.handleTap() } ```

การจับค่าหลายค่า

```swift let base = 100 let multiplier = 2 let compute = { [base, multiplier] in base * multiplier } print(compute()) // 200 ``` จับค่าหลายค่าไว้ในรายการเดียวกัน โดยคั่นด้วยจุลภาค

รายการจับค่าพร้อมการผูกชื่อ

```swift let myService = service // rename in capture list: let handler = { [service = myService] in service.process() } ``` มีประโยชน์เมื่อต้องการจับภาพค่าช่วงเวลาหนึ่งไว้ภายใต้ชื่อใหม่

แบบ Escaping กับแบบ Non-Escaping

• คลอสเชอร์ `@escaping` อาจถูกเก็บไว้และเรียกใช้หลังฟังก์ชันคืนค่าแล้ว → เสี่ยงเกิดวงจร • คลอสเชอร์แบบ non-escaping จะถูกเรียกใช้ก่อนฟังก์ชันคืนค่า → ไม่มีความเสี่ยงเกิดวงจร ```swift func apply(_ f: () -> Void) { f() } // non-escaping, no [weak] needed func later(_ f: @escaping () -> Void) { queue.async { f() } } // escaping ```

การแก้ไขปัญหาการจับค่า

หากสงสัยว่าเกิดวงจร: 1. เพิ่ม `deinit { print("deallocated") }` ลงในคลาส 2. ออกจากหน้าปัจจุบันหรือตั้งค่าอินสแตนซ์เป็น nil 3. หาก deinit ไม่พิมพ์ข้อความออกมา → มีวงจรเกิดขึ้น จากนั้นเพิ่ม `[weak self]` ให้กับคลอสเชอร์ในคลาสนั้น

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

`[weak self]` ในรายการจับค่าทำอะไร

สรุปทบทวน

ประเด็นสำคัญ: • คลอสเชอร์จับการอ้างอิงโดยค่าเริ่มต้น • รายการจับค่า `[value]` จะคัดลอกชนิดค่าขณะสร้าง • `[weak self]` — ไม่เก็บออบเจ็กต์ไว้ เปลี่ยนเป็น nil โดยอัตโนมัติ และใช้ `guard let self` • `[unowned self]` — ไม่เก็บออบเจ็กต์ไว้ และไม่ปลอดภัยเมื่อเป็น nil • คลอสเชอร์ `@escaping` ต้องใช้รายการจับค่า ส่วนคลอสเชอร์แบบ non-escaping มักไม่จำเป็นต้องใช้ จบหลักสูตรแล้ว! ถัดไป: การเขียนโปรแกรมเชิงฟังก์ชันใน Swift
เริ่มต้นได้ฟรี

เรียนรู้ Swift ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
122
บทเรียน
409

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

บทเรียน “รายการจับค่าของโคลสเชอร์และ [weak self]” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “รายการจับค่าของโคลสเชอร์และ [weak self]”

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

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

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

บทเรียน “รายการจับค่าของโคลสเชอร์และ [weak self]” ใช้เวลานานแค่ไหน

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

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

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

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

  1. ARC นับจำนวนการอ้างอิงอย่างไร
  2. วงจรการคงอ้างอิง: สาเหตุและการตรวจหา
  3. การอ้างอิงแบบ weak และ unowned
  4. รายการจับค่าของโคลสเชอร์และ [weak self]
← กลับไปที่ Swift Academy