Delegasyon modeli (delegation), Swift ekosisteminin en önemli unsurlarından biridir ve nesneler arasında olayların işlenmesi sorumluluğunu aktarmak için yaygın olarak kullanılır. Delegasyon, bir sınıfın davranışlarının bir bölümünü başka bir nesneye (delegat) devretmesine olanak tanır; bu genellikle bir protokol aracılığıyla belirlenir.
protocol DataUpdateDelegate: AnyObject { func didUpdateData(_ data: String) } class DataProvider { weak var delegate: DataUpdateDelegate? func updateData() { // ... veri güncelleme mantığı delegate?.didUpdateData("Yeni veri") } } class ViewController: UIViewController, DataUpdateDelegate { func didUpdateData(_ data: String) { print("Veri güncellendi: \(data)") } }
weak (veya unowned) olmalıdır, böylece retain cycle'ı önlenir.AnyObject'dan miras alınır, böylece weak referanslara izin verilir.Delegasyon uygulamanız için, delegat bir value type (örneğin, struct) ile ilişkiliyse nasıl yaparsınız?
Cevap:
Swift'te delegatlar referans tipleri (class veya AnyObject) olmalıdır, çünkü weak referanslar yalnızca referans tipleri için geçerlidir. Delegat bir struct veya enum olamaz, aksi takdirde sorunlar ortaya çıkar: derleyici weak özelliği kullanmanıza izin vermez; strong referans bir retain cycle'a yol açar.
// Hata! Delegatı struct olarak tanımlamak mümkün değil: derleyici bunu weak yapmanıza izin vermez protocol StructDelegate { ... } struct MyStructDelegate: StructDelegate { ... } weak var delegate: StructDelegate? // Hata
Hikaye
Bir projede delegat özelliği weak olarak işaretlemeyi unuttular. Sonuç olarak view ile delegat arasında bir retain cycle oluştu, uygulama yavaş yavaş bellek tüketmeye başladı ve yarım saat içinde çöküyordu.
Hikaye
Delegat, sınıf yerine value type (struct) ile uygulanmıştı. Delegat olması gereken IBOutlet bildirimleri alamıyordu — bağlantı hiç olmuyordu. Sorun yalnızca günlüklerin analizi ve hata ayıklama sonrası tespit edildi.
Hikaye
Bir projede delegat protokolü AnyObject'dan miras almıyordu ve delegat özelliği weak var olarak tanımlanmıştı. Bu, derleyici hatasına yol açtı ve ekibin bunu anlaması ve düzeltmesi zaman aldı.