Estoy tratando de entender el "cierre" de Swift con mayor precisión.
Pero @escaping
y Completion Handler
son demasiado difíciles de entender
Busqué muchas publicaciones de Swift y documentos oficiales, pero sentí que todavía no era suficiente.
Este es el ejemplo de código de documentos oficiales.
var completionHandlers: [()->Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping ()->Void){
completionHandlers.append(completionHandler)
}
func someFunctionWithNoneescapingClosure(closure: ()->Void){
closure()
}
class SomeClass{
var x:Int = 10
func doSomething(){
someFunctionWithEscapingClosure {
self.x = 100
//not excute yet
}
someFunctionWithNoneescapingClosure {
x = 200
}
}
}
let instance = SomeClass()
instance.doSomething()
print(instance.x)
completionHandlers.first?()
print(instance.x)
Escuché que hay dos formas y razones para usar @escaping
El primero es para almacenar un cierre, el segundo es para fines operativos Async.
Las siguientes son mis preguntas :
Primero, si se doSomething
ejecuta, someFunctionWithEscapingClosure
se ejecutará con el parámetro de cierre y ese cierre se guardará en la matriz de variables globales.
Creo que el cierre es {self.x = 100}
¿Cómo self
en {self.x = 100} esa variable global guardada completionHandlers
puede conectarse a instance
ese objeto de SomeClass
?
En segundo lugar, entiendo someFunctionWithEscapingClosure
así.
¡Para almacenar el cierre de la variable local completionHandler
en la we using
palabra clave global 'completeHandlers @ escaping`!
sin devoluciones de @escaping
palabras clave someFunctionWithEscapingClosure
, la variable local completionHandler
se eliminará de la memoria
@escaping
es mantener ese cierre en la memoria
¿Es esto correcto?
Por último, me pregunto acerca de la existencia de esta gramática.
Quizás esta sea una pregunta muy rudimentaria.
Si queremos que alguna función se ejecute después de alguna función específica. ¿Por qué no llamamos a alguna función después de una llamada a una función específica?
¿Cuáles son las diferencias entre usar el patrón anterior y usar una función de devolución de llamada de escape?
Aquí hay una pequeña clase de ejemplos que utilizo para recordarme cómo funciona @escaping.
fuente
@escaping
eliminatorias.i.e. escape the scope of this function.