Estou tentando entender 'Closure' de Swift com mais precisão.
Mas @escapinge Completion Handlersã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 doSomethingexecuta, então someFunctionWithEscapingClosureexecutará 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 selfem {self.x = 100} que salvo na variável global completionHandlerspode se conectar a instanceesse objeto de SomeClass?
Em segundo lugar, eu entendo someFunctionWithEscapingClosureassim.
Para armazenar o fechamento da variável local na palavra-chave completionHandler'completeHandlers we using@ escaping` da variável global !
sem o retorno da @escapingpalavra-chave someFunctionWithEscapingClosure, a variável local completionHandlerserá 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?
