Sobes.tech
Middle

Swift'te capture list hakkında bilgi ver.

sobes.tech yapay zeka

AI'dan gelen yanıt

Swift'te capture list, kapanışlar (closures) tarafından değişkenlerin açıkça yakalanmasını yönetmek için kullanılır. Bu, özellikle sınıflar içinde kullanılan kapanışlarda güçlü referans döngülerinden kaçınmaya yardımcı olur. Temel yakalama türleri: weak ve unowned'dır.

Yakalama Türü Açıklama Ne zaman kullanılır
weak Değişkeni opsiyonel olarak yakalar, referans sayacını artırmaz. Değeri nil olabilir. Kapanışın nesnesi, yakalanan nesneden daha uzun yaşayabilir.
unowned Değişkeni referans sayacını artırmadan yakalar, ancak yakalanan nesnenin kapanış süresince yaşayacağı varsayılır. Opsiyonel değildir. Kapanış nesnesi ve yakalanan nesne aynı ömre sahipse ve yakalanan nesne, kapanış tamamlanmadan nil olmayacaksa.

Capture list sözdizimi:

{ [capture list] (parametreler) -> dönüşTipi in
    // kod
}

weak self kullanımı örneği:

class MyClass {
    var value = 0

    func doSomethingLater() {
        DispatchQueue.main.asyncAfter(deadline: .now() + 1) { [weak self] in
            guard let self = self else { return } // nil kontrolü
            self.value += 1
            print("Değer şu an \(self.value)")
        }
    }
}

unowned self kullanımı örneği:

class ViewController: UIViewController {
    var button: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        button = UIButton(type: .system)
        button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
    }

    @objc func buttonTapped() {
        // unowned self bu durumda gerekmez, çünkü buton ViewController var oldukça mevcuttur.
        // Ama kapanış, ViewController'dan uzun yaşayacaksa, unowned uygun olabilir, eğer
        // self'in nil olmayacağından eminseniz.
        let action = { [unowned self] in
             self.view.backgroundColor = .blue
        }
        action()
    }
}

Sadece self değil, kapanışta erişilebilir diğer değişkenler de yakalanabilir. Örneğin, kapanış oluşturulurken bir değişkenin değerini saklamak için:

func createIncrementer(initialValue: Int) -> () -> Int {
    var currentValue = initialValue
    return { [initialValue] in // initialValue değer olarak yakalanır
        currentValue += 1
        print("Başlangıç değeri \(initialValue)") // initialValue kendi değerini korur
        return currentValue
    }
}

let incrementer = createIncrementer(initialValue: 5)
print(incrementer()) // Çıktı: Başlangıç değeri 5, sonra 6
print(incrementer()) // Çıktı: Başlangıç değeri 5, sonra 7