Suche…


Einführung

Aus Swift Documentarion

Eine Schließung entgeht einer Funktion, wenn die Schließung als Argument an die Funktion übergeben wird, sie wird jedoch aufgerufen, nachdem die Funktion zurückgegeben wurde. Wenn Sie eine Funktion deklarieren, die einen Abschluss als einen ihrer Parameter akzeptiert, können Sie @escaping vor dem Parametertyp schreiben, um anzuzeigen, dass der Abschluss flüchtet.

Nicht flüchtiger Verschluss

In Swift 1 und 2 wurden die Abschlussparameter standardmäßig deaktiviert. Wenn Sie wussten, dass Ihre Schließung dem Funktionshauptteil nicht entgehen könnte, könnten Sie den Parameter mit dem Attribut @noescape markieren.

In Swift 3 ist es umgekehrt: Schließungsparameter werden standardmäßig nicht festgelegt. Wenn Sie beabsichtigen, die Funktion zu umgehen, müssen Sie sie mit dem @escaping-Attribut markieren.

class ClassOne {
  // @noescape is applied here as default
  func methodOne(completion: () -> Void) {
    // 
  }
}

class ClassTwo {
  let obj = ClassOne()
  var greeting = "Hello, World!"

  func methodTwo() {
    obj.methodOne() {
      // self.greeting is required
      print(greeting)
    }
  }
}

Fliehender Verschluss

Aus Swift Documentarion

@escaping

Wenden Sie dieses Attribut auf den Typ eines Parameters in einer Methoden- oder Funktionsdeklaration an, um anzuzeigen, dass der Parameterwert für eine spätere Ausführung gespeichert werden kann. Dies bedeutet, dass der Wert die Lebensdauer des Anrufs überleben darf. Funktionstypparameter mit dem Escape-Typattribut erfordern die explizite Verwendung von self. für Eigenschaften oder Methoden.

class ClassThree {

    var closure: (() -> ())?

    func doSomething(completion: @escaping () -> ()) {
        closure = finishBlock
    }
}

Im obigen Beispiel wird der Beendigungsblock bis zum Abschluss gespeichert und lebt buchstäblich über den Funktionsaufruf hinaus. Der Complier muss also den Abschlussblock als @escaping markieren.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow