Recherche…


Introduction

De Swift Documentarion

Une fermeture est dite échapper à une fonction lorsque la fermeture est passée en argument à la fonction, mais est appelée après le retour de la fonction. Lorsque vous déclarez une fonction qui prend une fermeture comme l'un de ses paramètres, vous pouvez écrire @escaping avant le type du paramètre pour indiquer que la fermeture est autorisée à s'échapper.

Fermeture sans fuite

Dans Swift 1 et 2, les paramètres de fermeture s'échappaient par défaut. Si vous saviez que votre fermeture n'échapperait pas au corps de la fonction, vous pourriez marquer le paramètre avec l'attribut @noescape.

Dans Swift 3, c'est l'inverse: les paramètres de fermeture sont non-échappant par défaut. Si vous souhaitez que la fonction échappe à la fonction, vous devez la marquer avec l'attribut @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)
    }
  }
}

Fermeture de fermeture

De Swift Documentarion

@ esquiver

Appliquez cet attribut à un type de paramètre dans une déclaration de méthode ou de fonction pour indiquer que la valeur du paramètre peut être stockée pour une exécution ultérieure. Cela signifie que la valeur est autorisée à survivre à la durée de vie de l'appel. Les paramètres de type de fonction avec l'attribut de type d'échappement nécessitent une utilisation explicite de self. pour les propriétés ou les méthodes.

class ClassThree {

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

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

Dans l'exemple ci-dessus, le bloc d'achèvement est enregistré à la fermeture et passera littéralement au-delà de l'appel de fonction. Donc complier va forcer à marquer le bloc d'achèvement comme @escaping.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow