Swift Academy · Lektion

Autoclosures

Verzögern Sie die Auswertung von Ausdrücken mit @autoclosure.

Lektion 4 von 413 Schritte

Autoclosures ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Swift Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist eine Autoclosure?

@autoclosure verpackt einen Argumentausdruck automatisch in eine Closure, sodass er erst ausgewertet wird, wenn die Funktion ihn tatsächlich verwendet. Der Aufrufer schreibt einen gewöhnlichen Ausdruck, keine Closure.

Ohne Autoclosure

Normalerweise erfordert verzögerte Auswertung eine explizite Closure an der Aufrufstelle:

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

Mit Autoclosure

@autoclosure ermöglicht es dem Aufrufer, einen einfachen Ausdruck zu übergeben:

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

Nachweis der verzögerten Auswertung

Der Ausdruck wird erst ausgeführt, wenn die Closure aufgerufen wird:

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

Wo die Standardbibliothek sie verwendet

Die Operatoren && und ||, assert und ?? verwenden alle Autoclosures, sodass die rechte Seite nur bei Bedarf ausgewertet wird.

Kurzschlussauswertung wie bei ??

Eine eigene Funktion für einen Standardwert, die den Fallback überspringt, wenn er nicht benötigt wird:

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

Verzögerte Meldungen im assert-Stil

Erstellen Sie die Meldung erst, wenn die Prüfung fehlschlägt:

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

Autoclosure plus Escaping

Kombinieren Sie dies mit @escaping, um den verzögerten Ausdruck für später zu speichern:

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

Lesbarere Aufrufstellen

Der Vorteil ist rein syntaktisch: Aufrufer schreiben einen Wert, die Funktion erhält eine Closure:

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

Wann Sie es NICHT verwenden sollten

Autoclosures verbergen, dass ein Argument eine Closure ist, was Leser überraschen kann. Verwenden Sie sie sparsam — nur wenn die verzögerte Auswertung tatsächlich hilft, etwa um aufwendige Standardwerte zu vermeiden.

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

Autoclosures akzeptieren keine Argumente

Eine Autoclosure hat immer die Form () -> T — sie verpackt einen einzelnen Ausdruck und kann keine Parameter akzeptieren:

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

Kurze Überprüfung

Was bewirkt @autoclosure mit seinem Argument?

Zusammenfassung

Sie haben Autoclosures kennengelernt:

  • @autoclosure verpackt einen Argumentausdruck in eine Closure des Typs () -> T
  • Der Ausdruck wird erst ausgeführt, wenn die Funktion ihn aufruft — verzögerte Auswertung
  • Dies ermöglicht &&, ||, ?? und assert
  • Kombinieren Sie es mit @escaping, um Ausdrücke zu speichern; verwenden Sie es aus Gründen der Klarheit sparsam

Kurs abgeschlossen! Als Nächstes: Equatable, Hashable, Comparable.

Kostenlos starten

Lerne Swift mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
122
Lektionen
409

Häufig gestellte Fragen

Ist die Lektion „Autoclosures“ kostenlos?

Ja — der vollständige Text von „Autoclosures“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Swift Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Autoclosures“?

Verzögern Sie die Auswertung von Ausdrücken mit @autoclosure. Du übst Swift Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Swift Academy zu starten?

Keine Vorkenntnisse erforderlich. Swift Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Autoclosures“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Swift Academy-Lektion Code schreiben und ausführen?

Ja. Jede Swift Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Werte per Referenz erfassen
  2. Escaping Closures
  3. Capture-Listen und Weak Self
  4. Autoclosures
← Zurück zu Swift Academy