Swift Academy · Lektion

Escaping Closures

Speichern Sie Closures, die ihre Funktion überdauern.

Lektion 2 von 413 Schritte

Escaping Closures ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 2 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.

Escaping und Non-Escaping

Standardmäßig ist ein Closure-Parameter non-escaping: Er muss aufgerufen werden, bevor die Funktion zurückkehrt. Kennzeichnen Sie ihn mit @escaping, wenn er gespeichert und später aufgerufen werden kann.

Eine Non-Escaping-Closure

Diese Closure wird synchron ausgeführt und ist nicht mehr vorhanden, wenn die Funktion zurückkehrt:

func run(_ work: () -> Void) {
    work()
}
run { print("done now") }  // "done now"

Warum @escaping erforderlich ist

Das spätere Speichern einer Closure erfordert @escaping:

var handlers: [() -> Void] = []
func register(_ handler: @escaping () -> Void) {
    handlers.append(handler)  // escapes the function
}
register { print("later") }
handlers[0]()  // "later"

Escaping bei asynchroner Arbeit

Completion-Handler sind escapend, weil sie nach der Rückkehr der Funktion ausgeführt werden:

func load(then completion: @escaping (String) -> Void) {
    // imagine async work
    completion("data")
}
load { result in print(result) }  // "data"

self muss explizit angegeben werden

Innerhalb einer escapenden Closure müssen Sie beim Zugriff auf Instanzmitglieder ausdrücklich self. schreiben — als Hinweis darauf, dass die Closure self möglicherweise festhält.

Explizites self bei Escaping

Der Compiler verlangt die explizite Referenz:

class Loader {
    var name = "L"
    func start(_ done: @escaping () -> Void) {
        let cb = { print(self.name); done() }
        cb()
    }
}
Loader().start { print("finished") }  // "L" then "finished"

Viele Callbacks speichern

Escapende Closures ermöglichen den Aufbau von Beobachterlisten:

class Emitter {
    private var listeners: [(Int) -> Void] = []
    func on(_ l: @escaping (Int) -> Void) { listeners.append(l) }
    func fire(_ v: Int) { listeners.forEach { $0(v) } }
}
let e = Emitter()
e.on { print("got \($0)") }
e.fire(7)  // "got 7"

Eine gespeicherte Closure zurückgeben

In Eigenschaften gespeicherte Closures sind escapend:

class Button {
    var action: (() -> Void)?
    func setAction(_ a: @escaping () -> Void) { action = a }
}
let b = Button()
b.setAction { print("tapped") }
b.action?()  // "tapped"

Optionale Closures sind escapend

Ein optionaler Closure-Parameter ist implizit escapend (er wird in Optional verpackt) und kann daher gespeichert werden:

func maybe(_ f: (() -> Void)?) {
    f?()
}
maybe { print("ran") }  // "ran"

Escaping in einem Array von Aufgaben

Eine Warteschlange aufgeschobener Arbeit ist ein klassischer Anwendungsfall für Escaping — jede Closure wird gespeichert und später ausgeführt:

var tasks: [() -> Int] = []
func schedule(_ task: @escaping () -> Int) {
    tasks.append(task)
}
schedule { 1 + 1 }
schedule { 10 * 2 }
print(tasks.map { $0() })  // [2, 20]

Hinweis zur Performance

Non-Escaping-Closures können aggressiver optimiert werden (keine Heap-Allocation erforderlich). Lassen Sie Closures nach Möglichkeit non-escaping; verwenden Sie Escaping nur, wenn Sie sie tatsächlich speichern oder aufschieben.

func sum(_ xs: [Int], _ f: (Int) -> Int) -> Int {
    xs.reduce(0) { $0 + f($1) }   // non-escaping, fast
}
print(sum([1, 2, 3]) { $0 * $0 })  // 14

Kurze Überprüfung

Wann muss ein Closure-Parameter mit @escaping gekennzeichnet werden?

Zusammenfassung

Sie haben escapende Closures kennengelernt:

  • Non-Escaping ist die Standardeinstellung; Closures werden vor der Rückkehr der Funktion ausgeführt
  • @escaping ist erforderlich, um eine Closure zu speichern oder aufzuschieben
  • Escapende Closures erfordern expliziten Zugriff über self.
  • Optionale Closure-Parameter sind implizit escapend; bevorzugen Sie für bessere Performance Non-Escaping

Als Nächstes: Capture-Listen und weak self.

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 „Escaping Closures“ kostenlos?

Ja — der vollständige Text von „Escaping Closures“ 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 „Escaping Closures“?

Speichern Sie Closures, die ihre Funktion überdauern. 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 2 von 4.

Wie lange dauert die Lektion „Escaping Closures“?

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