Buscar..


Introducción

Desde Swift Documentarion

Se dice que un cierre escapa a una función cuando el cierre se pasa como un argumento a la función, pero se llama después de que la función retorna. Cuando declara una función que toma un cierre como uno de sus parámetros, puede escribir @escaping antes del tipo de parámetro para indicar que se permite que el cierre se escape.

Cierre sin escape

En Swift 1 y 2, los parámetros de cierre se escapaban por defecto. Si sabía que su cierre no escaparía al cuerpo de la función, podría marcar el parámetro con el atributo @noescape.

En Swift 3, es al revés: los parámetros de cierre no se escapan por defecto. Si pretende que se escape de la función, debe marcarla con el atributo @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)
    }
  }
}

Cierre de escape

Desde Swift Documentarion

@escaping

Aplique este atributo al tipo de parámetro en una declaración de método o función para indicar que el valor del parámetro se puede almacenar para su ejecución posterior. Esto significa que se permite que el valor supere la vida útil de la llamada. Los parámetros de tipo de función con el atributo de tipo de escape requieren el uso explícito de self. Para propiedades o métodos.

class ClassThree {

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

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

En el ejemplo anterior, el bloque de finalización se guarda en el cierre y, literalmente, vivirá más allá de la llamada a la función. Así que complier forzará a marcar el bloque de finalización como @escaping.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow