Swift'in 'Kapanışını' daha net anlamaya çalışıyorum.
Ama @escapingve Completion Handleranlaşılması çok zor
Birçok Swift ilanını ve resmi belgeyi araştırdım, ancak yine de yeterli olmadığını hissettim.
Bu resmi belgelerin kod örneğidir
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)
Kullanmanın iki yolu ve nedeni olduğunu duydum @escaping
Birincisi, bir kapağın depolanması için, ikincisi Async işletim amaçları içindir.
Aşağıdakiler sorularım :
İlk olarak, eğer doSomethingçalıştırılırsa daha sonra someFunctionWithEscapingClosurekapanma parametresi ile çalıştırılacak ve bu kapanış global değişken dizisine kaydedilecektir.
Bence kapanış {self.x = 100}
Nasıl selfgenel değişken kaydedilir {self.x = 100} içinde completionHandlersbağlanabilir instanceo nesne SomeClass?
İkincisi, someFunctionWithEscapingClosureböyle anlıyorum .
Yerel değişken kapanışını completionHandlerglobal değişken 'completeHandlers we using@ escaping` anahtar kelimesine depolamak için !
@escapinganahtar kelime someFunctionWithEscapingClosuredönüşleri olmadan yerel değişken completionHandlerbellekten kaldırılır
@escaping bu kapanışı hafızada tutmak mı
Bu doğru mu?
Son olarak, bu gramerin varlığını merak ediyorum.
Belki bu çok basit bir sorudur.
Bir işlevin belirli bir işlevden sonra yürütülmesini istiyorsak. Neden belirli bir işlev çağrısından sonra bazı işlevleri çağırmıyoruz?
Yukarıdaki kalıbı kullanmakla kaçan bir geri arama işlevi kullanmak arasındaki farklar nelerdir?
