Sto cercando di capire più precisamente "Closure" di Swift.
Ma @escaping
e Completion Handler
sono troppo difficili da capire
Ho cercato in molti messaggi Swift e documenti ufficiali, ma sentivo che non era ancora abbastanza.
Questo è il codice di esempio di documenti ufficiali
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)
Ho sentito che ci sono due modi e motivi per utilizzare @escaping
Il primo è per memorizzare una chiusura, il secondo è per scopi operativi Async.
Le seguenti sono le mie domande :
Innanzitutto, se doSomething
viene eseguito, someFunctionWithEscapingClosure
verrà eseguito con il parametro di chiusura e tale chiusura verrà salvata nell'array di variabili globali.
Penso che la chiusura sia {self.x = 100}
Come self
in {self.x = 100} quella salvata nella variabile globale completionHandlers
può connettersi a instance
quell'oggetto di SomeClass
?
Secondo, capisco in someFunctionWithEscapingClosure
questo modo.
Per memorizzare la chiusura della variabile locale completionHandler
nella we using
parola chiave della variabile globale 'completamentoHandlers @ escaping`!
senza restituzioni di @escaping
parole chiave someFunctionWithEscapingClosure
, la variabile locale completionHandler
verrà rimossa dalla memoria
@escaping
è mantenere quella chiusura nella memoria
È giusto?
Infine, mi chiedo solo l'esistenza di questa grammatica.
Forse questa è una domanda molto rudimentale.
Se vogliamo che una funzione venga eseguita dopo una funzione specifica. Perché non chiamiamo solo una funzione dopo una chiamata di funzione specifica?
Quali sono le differenze tra l'utilizzo del modello precedente e l'utilizzo di una funzione di callback di escape?