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

แบบ 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)  // 12

closure แบบหลุดออก

ระบุพารามิเตอร์ด้วย @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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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