แบบ escaping กับไม่ escaping และออโตคลอสเชอร์
ทำความเข้าใจคลอสเชอร์แบบไม่ escaping (ค่าเริ่มต้น) เทียบกับ @escaping (จัดเก็บหรือใช้หลังการส่งกลับ) และใช้ @autoclosure เพื่อให้จุดเรียกใช้งานอ่านง่ายขึ้นด้วยการประเมินแบบเลื่อนเวลา
แบบ escaping กับไม่ escaping และออโตคลอสเชอร์ เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 3 บทเรียน
ภาพรวม
เป้าหมาย: รู้ว่าเมื่อใด closure เป็นแบบไม่หลุดออก ซึ่งเป็นค่าเริ่มต้น เทียบกับแบบ @escaping ที่ถูกเก็บไว้หรือทำงานแบบอะซิงก์ และรู้ว่า @autoclosure ช่วยให้จุดเรียกใช้อ่านง่ายขึ้นอย่างไร
ค่าเริ่มต้นแบบไม่หลุดออก
พารามิเตอร์ closure เป็นแบบไม่หลุดออกโดยค่าเริ่มต้น จะถูกเรียกก่อนฟังก์ชันคืนค่าและไม่ถูกเก็บไว้
// Non-escaping by default: used immediately inside the function.
func applyTwice(_ f: (Int) -> Int, to x: Int) -> Int {
return f(f(x)) // called synchronously; not stored
}
let doubled = applyTwice({ $0 * 2 }, to: 3)
print(doubled) // 12closure แบบหลุดออก
ระบุพารามิเตอร์ด้วย @escaping หากคุณเก็บ closure ไว้หรือเรียกใช้หลังจากคืนค่าแล้ว เช่น ตัวจับเวลาและงานแบบอะซิงก์
// Need @escaping when storing for later use:
var tasks: [() -> Void] = []
func addTask(_ work: @escaping () -> Void) {
tasks.append(work) // stored to run later
}
addTask { print("run later") }
tasks.forEach { $0() }การทำงานเสร็จแบบอะซิงก์
ส่วนติดต่อการเขียนโปรแกรมแบบอะซิงก์มักรับตัวจัดการเมื่อเสร็จสิ้นแบบ @escaping ซึ่งจะถูกเรียกหลังจากฟังก์ชันคืนค่าแล้ว
func fetchData(completion: @escaping (String) -> Void) {
// simulate async: call completion in the future
// (In real apps, use DispatchQueue or URLSession)
completion("done") // still escaping by contract (may be called later)
}
fetchData { result in print(result) }การสร้าง closure อัตโนมัติ
@autoclosure ทำให้ผู้เรียกส่งนิพจน์แทนการเขียน closure ได้ จึงช่วยให้อ่านง่ายขึ้น
// @autoclosure converts an expression into () -> Bool automatically.
func logIf(_ condition: @autoclosure () -> Bool) {
if condition() { print("Condition is true") }
}
let x = 3
logIf(x > 1) // no braces needed; expression is turned into a closureการสร้าง closure อัตโนมัติและการหลุดออก
@autoclosure @escaping จะเก็บนิพจน์ที่ส่งมาไว้เพื่อประเมินภายหลัง โปรดคำนึงถึงสถานะที่ถูกจับและจังหวะเวลา
// You can combine @autoclosure with @escaping:
// (be careful: the expression is captured and evaluated later)
var checks: [() -> Bool] = []
func enqueueCheck(_ condition: @autoclosure @escaping () -> Bool) {
checks.append(condition) // stored to run later
}
var threshold = 10
enqueueCheck(threshold > 5) // captures current variable by reference semantics
threshold = 3
print(checks.map { $0() }) // re-evaluates with updated thresholdกฎของการหลุดออก
ตรวจสอบอย่างรวดเร็ว: จำเป็นต้องใช้ @escaping เมื่อใด
สรุปทบทวน
สรุปทบทวน: closure เป็นแบบไม่หลุดออกโดยค่าเริ่มต้น ใช้ @escaping เมื่อถูกเก็บไว้หรือเรียกใช้ภายหลัง ใช้ @autoclosure เพื่อให้จุดเรียกใช้อ่านง่ายขึ้น และใช้ร่วมกับ @escaping อย่างระมัดระวัง
คำถามที่พบบ่อย
บทเรียน “แบบ escaping กับไม่ escaping และออโตคลอสเชอร์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “แบบ escaping กับไม่ escaping และออโตคลอสเชอร์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 3 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “แบบ escaping กับไม่ escaping และออโตคลอสเชอร์”
ทำความเข้าใจคลอสเชอร์แบบไม่ escaping (ค่าเริ่มต้น) เทียบกับ @escaping (จัดเก็บหรือใช้หลังการส่งกลับ) และใช้ @autoclosure เพื่อให้จุดเรียกใช้งานอ่านง่ายขึ้นด้วยการประเมินแบบเลื่อนเวลา คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน
บทเรียน “แบบ escaping กับไม่ escaping และออโตคลอสเชอร์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม
ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐานคลอสเชอร์และการจับค่า
- รายการจับค่า — weak/unowned และการจับค่า
- แบบ escaping กับไม่ escaping และออโตคลอสเชอร์