Estou tentando entender 'Closure' de Swift com mais precisão.
Mas @escaping
e Completion Handler
são muito difíceis de entender
Pesquisei muitas postagens e documentos oficiais do Swift, mas senti que ainda não era o suficiente.
Este é o exemplo de código de documentos oficiais
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)
Ouvi dizer que existem duas maneiras e razões para usar @escaping
O primeiro é para armazenar um fechamento, o segundo é para fins operacionais Async.
A seguir estão minhas perguntas :
Primeiro, se doSomething
executa, então someFunctionWithEscapingClosure
executará com o parâmetro de fechamento e esse fechamento será salvo no array de variável global.
Acho que o fechamento é {self.x = 100}
Como self
em {self.x = 100} que salvo na variável global completionHandlers
pode se conectar a instance
esse objeto de SomeClass
?
Em segundo lugar, eu entendo someFunctionWithEscapingClosure
assim.
Para armazenar o fechamento da variável local na palavra-chave completionHandler
'completeHandlers we using
@ escaping` da variável global !
sem o retorno da @escaping
palavra-chave someFunctionWithEscapingClosure
, a variável local completionHandler
será removida da memória
@escaping
é manter esse fechamento na memória
Isto está certo?
Por último, apenas me pergunto sobre a existência dessa gramática.
Talvez esta seja uma questão muito rudimentar.
Se quisermos que alguma função seja executada após alguma função específica. Por que simplesmente não chamamos alguma função após uma chamada de função específica?
Quais são as diferenças entre usar o padrão acima e usar uma função de retorno de chamada de escape?
Aqui está uma pequena classe de exemplos que uso para me lembrar de como funciona o @escaping.
fonte
@escaping
eliminatórias.i.e. escape the scope of this function.