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

Autoclosures

เลื่อนการประเมินนิพจน์ด้วย @autoclosure

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

Autoclosure คืออะไร

@autoclosure จะห่อ expression ของอาร์กิวเมนต์ไว้ใน closure โดยอัตโนมัติ ดังนั้น expression นั้นจึง ยังไม่ถูกประเมินจนกว่าฟังก์ชันจะใช้งานจริง ผู้เรียกเขียน expression ธรรมดา ไม่ใช่ closure

เมื่อไม่มี Autoclosure

โดยปกติ การประเมินแบบเลื่อนเวลาต้องใช้ closure อย่างชัดเจนตรงจุดเรียกใช้:

func logIf(_ cond: Bool, _ message: () -> String) {
    if cond { print(message()) }
}
logIf(true) { "expensive" }  // caller writes braces

เมื่อมี Autoclosure

@autoclosure ทำให้ผู้เรียกส่ง expression เปล่า ๆ ได้:

func logIf(_ cond: Bool, _ message: @autoclosure () -> String) {
    if cond { print(message()) }
}
logIf(true, "expensive")  // no braces, evaluated only if cond

หลักฐานของการประเมินแบบเลื่อนเวลา

expression จะทำงานเมื่อมีการเรียกใช้ closure เท่านั้น:

func pick(_ cond: Bool, _ value: @autoclosure () -> Int) -> Int {
    cond ? value() : -1
}
func costly() -> Int { print("computed"); return 42 }
print(pick(false, costly()))  // -1  -- "computed" never prints

จุดที่ไลบรารีมาตรฐานใช้สิ่งนี้

ตัวดำเนินการ && และ || รวมถึง assert และ ?? ล้วนใช้ autoclosures เพื่อให้ด้านขวาถูกประเมินเมื่อจำเป็นเท่านั้น

หยุดทันทีแบบ ??

ฟังก์ชันค่าปริยายแบบกำหนดเองที่ข้าม fallback เมื่อไม่จำเป็น:

func orElse<T>(_ value: T?, _ fallback: @autoclosure () -> T) -> T {
    value ?? fallback()
}
func makeDefault() -> Int { print("built"); return 0 }
print(orElse(5, makeDefault()))  // 5  -- "built" never prints

ข้อความแบบ assert ที่ประเมินเมื่อจำเป็น

สร้างข้อความเฉพาะเมื่อการตรวจสอบไม่ผ่าน:

func check(_ cond: Bool, _ msg: @autoclosure () -> String) {
    if !cond { print("FAIL: \(msg())") }
}
check(true, "this is never built")
check(false, "boom")  // FAIL: boom

Autoclosure ร่วมกับ Escaping

ใช้ร่วมกับ @escaping เพื่อเก็บ expression ที่เลื่อนเวลาไว้สำหรับใช้ภายหลัง:

var thunks: [() -> Int] = []
func defer2(_ expr: @autoclosure @escaping () -> Int) {
    thunks.append(expr)
}
defer2(1 + 1)
print(thunks[0]())  // 2  -- computed on demand

อ่านง่ายขึ้นตรงจุดเรียกใช้

ข้อดีนี้เป็นเรื่องไวยากรณ์ล้วน ๆ: ผู้เรียกเขียนค่า แต่ฟังก์ชันได้รับ closure:

func unless(_ cond: Bool, _ value: @autoclosure () -> String) -> String {
    cond ? "skipped" : value()
}
print(unless(false, "shown"))  // "shown"

เมื่อไม่ควรใช้ NOT

Autoclosures ซ่อนข้อเท็จจริงที่ว่าอาร์กิวเมนต์เป็น closure ซึ่งอาจทำให้ผู้อ่านประหลาดใจ ใช้อย่างพอเหมาะ — เฉพาะเมื่อการประเมินแบบเลื่อนเวลาช่วยได้จริง เช่น การหลีกเลี่ยงค่าปริยายที่คำนวณได้ยาก

func first<T>(_ a: T?, _ b: @autoclosure () -> T) -> T { a ?? b() }
print(first(nil, 99))  // 99

Autoclosures ไม่รับอาร์กิวเมนต์

autoclosure จะมีรูปแบบ () -> T เสมอ — มันห่อ expression เดียวและไม่สามารถรับพารามิเตอร์ได้:

func once(_ make: @autoclosure () -> [Int]) -> Int {
    make().count
}
print(once([1, 2, 3]))  // 3

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

@autoclosure ทำอะไรกับอาร์กิวเมนต์ของมัน

สรุป

คุณได้เรียนรู้เกี่ยวกับ autoclosures:

  • @autoclosure จะห่อ expression ของอาร์กิวเมนต์ไว้ใน closure รูปแบบ () -> T
  • expression จะทำงานเมื่อฟังก์ชันเรียกใช้เท่านั้น — เป็นการประเมินแบบเลื่อนเวลา
  • เป็นกลไกเบื้องหลัง &&, ||, ?? และ assert
  • ใช้ร่วมกับ @escaping เพื่อจัดเก็บ แต่ควรใช้เท่าที่จำเป็นเพื่อให้โค้ดชัดเจน

จบหลักสูตรแล้ว! ถัดไป: Equatable, Hashable, Comparable

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

บทเรียน “Autoclosures” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “Autoclosures”

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

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

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

บทเรียน “Autoclosures” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การจับค่าด้วยการอ้างอิง
  2. คลอเชอร์ที่หลุดออกนอกขอบเขต
  3. รายการจับค่าและ weak self
  4. Autoclosures
← กลับไปที่ Swift Academy