Sto cercando di capire più precisamente "Closure" di Swift.
Ma @escapinge Completion Handlersono 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 doSomethingviene eseguito, someFunctionWithEscapingClosureverrà 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 selfin {self.x = 100} quella salvata nella variabile globale completionHandlerspuò connettersi a instancequell'oggetto di SomeClass?
Secondo, capisco in someFunctionWithEscapingClosurequesto modo.
Per memorizzare la chiusura della variabile locale completionHandlernella we usingparola chiave della variabile globale 'completamentoHandlers @ escaping`!
senza restituzioni di @escapingparole chiave someFunctionWithEscapingClosure, la variabile locale completionHandlerverrà 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?
