Ricerca…


introduzione

Da Swift Documentarion

Si dice che una chiusura sfugge ad una funzione quando la chiusura viene passata come argomento alla funzione, ma viene richiamata dopo il ritorno della funzione. Quando dichiari una funzione che accetta una chiusura come uno dei suoi parametri, puoi scrivere @escaping prima del tipo del parametro per indicare che la chiusura può uscire.

Chiusura senza fuga

In Swift 1 e 2, i parametri di chiusura erano in fuga per impostazione predefinita. Se sapessi che la tua chiusura non sfugge al corpo della funzione, puoi contrassegnare il parametro con l'attributo @noescape.

In Swift 3, è il contrario: i parametri di chiusura non sfuggono di default. Se si desidera che la funzione sfugga, è necessario contrassegnarla con l'attributo @escaping.

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)
    }
  }
}

Chiusura di fuga

Da Swift Documentarion

@escaping

Applicare questo attributo al tipo di un parametro in una dichiarazione di metodo o funzione per indicare che il valore del parametro può essere memorizzato per l'esecuzione successiva. Ciò significa che il valore può superare la durata della chiamata. I parametri del tipo di funzione con l'attributo del tipo di escape richiedono l'uso esplicito di self. per proprietà o metodi.

class ClassThree {

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

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

Nell'esempio precedente il blocco di completamento viene salvato in chiusura e vivrà letteralmente oltre la chiamata di funzione. Quindi il compilatore costringerà a contrassegnare il blocco di completamento come @escaping.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow