Sobes.tech
Junior

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, sorted metodları 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...
    }
}