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