Swift'in 'Kapanışını' daha net anlamaya çalışıyorum.
Ama @escaping
ve Completion Handler
anlaşı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 someFunctionWithEscapingClosure
kapanma parametresi ile çalıştırılacak ve bu kapanış global değişken dizisine kaydedilecektir.
Bence kapanış {self.x = 100}
Nasıl self
genel değişken kaydedilir {self.x = 100} içinde completionHandlers
bağlanabilir instance
o nesne SomeClass
?
İkincisi, someFunctionWithEscapingClosure
böyle anlıyorum .
Yerel değişken kapanışını completionHandler
global değişken 'completeHandlers we using
@ escaping` anahtar kelimesine depolamak için !
@escaping
anahtar kelime someFunctionWithEscapingClosure
dönüşleri olmadan yerel değişken completionHandler
bellekten 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?