Kapanma nedir?
sobes.tech yapay zeka
AI'dan gelen yanıt
Swift'te kapanış (closure), kodda iletilebilen ve kullanılabilen bağımsız bir işlev bloğudur ({}). Kapanışlar, tanımlandıkları bağlamdaki herhangi bir sabit veya değişkenin referanslarını yakalayabilir ve saklayabilir.
Kullanım örnekleri:
- Fonksiyonların argümanları olarak (örneğin, Tamamlama İşleyicileri).
- Koleksiyonların sıralanması sırasında davranışın tanımlanması (örneğin,
map,filter,reduce,sortedmetodları kullanılarak). - Kodun gecikmeli yürütülmesi için.
Sözdizimi:
// Temel sözdizimi
{ (parametreler) -> dönüşTipi in
ifadeler
}
// Bir Int alan ve String döndüren kapanış örneği
let integerToString: (Int) -> String = { (number: Int) -> String in
return "Sayı: \(number)"
}
Özellikler:
- Otomatik değişken yakalama.
- Parametrelerin ve dönüş değerinin açıkça belirtilmediği kapanışların tanımlanması (sözdizimsel şekerleme).
- Kısaltılmış parametre isimleri kullanımı ($0, $1, vb.).
- Trailing closure sözdizimi.
Değişkenlerin yakalanması:
Bir kapanış, kendi çevresinden değişkenleri yakalayabilir. Varsayılan olarak, yakalama referansla yapılır. Eğer kapanış, orijinal değişkenin kapsam dışına çıkmasından sonra kullanılırsa, yine de ona erişimi korur.
func makeIncrementer(forIncrement amount: Int) -> () -> Int {
var runningTotal = 0 // Dış bağlamdan değişken
let incrementer: () -> Int = { // Kapanış
runningTotal += amount // runningTotal ve amount'u yakalar
return runningTotal
}
return incrementer
}
let incrementByTen = makeIncrementer(forIncrement: 10)
print(incrementByTen()) // Çıktı: 10
print(incrementByTen()) // Çıktı: 20
Yakalama Listeleri (Capture Lists):
Değişkenlerin nasıl yakalanacağına açıkça karar vermek ve güçlü referans döngülerini (retain cycles) önlemek için kullanılır.
class MyClass {
var value = 0
lazy var myClosure: () -> Void = { [self, value] in // self'yi referansla, value'yu değerle yakalar
print("self.value değeri: \(self.value)")
print("Yakalanan değer: \(value)")
}
deinit {
print("MyClass örneği serbest bırakıldı")
}
}
Sınıf nesnelerini yakalarken güçlü referans döngülerini önlemek için [weak self] veya [unowned self] sözdizimi kullanılır.
class ViewController {
var dataFetcher: DataFetcher?
func fetchData() {
dataFetcher?.fetch { [weak self] result in // Zayıf referans self
guard let self = self else { return } // self'in varlığını kontrol et
// Sonuç işleme
}
}
}
class DataFetcher {
var completionHandler: ((Result<String, Error>) -> Void)?
func fetch(completion: @escaping (Result<String, Error>) -> Void) {
self.completionHandler = completion
// Asenkron işlem...
}
}