Associated Values — her bir enum durumuna ayrı ayrı rastgele veri eklemeye izin veren bir Swift mekanizması. Tüm durumların aynı türde değerlere sahip olduğu raw values'ın aksine, associated values her durum için tür ve miktar olarak farklılık gösterebilir. Apple Documentation, 2026'ya göre, bu, ek sarmalayıcı türler oluşturmadan bir alanı doğru bir şekilde modellemek için önemli bir yetenektir.
Önemli Noktalar
Associated Values, bir enum durumunun kendisiyle birlikte saklayabileceği ek bilgilerdir. Bildirim düzeyinde sabit olan raw values'ın aksine, associated values bir enum örneği oluşturulurken ayarlanır.
Bir ödeme yöntemini modellediğinizi hayal edin: creditCard durumu son 4 haneyi ve son kullanma tarihini saklayabilirken, applePay durumu hiçbir şey saklamaz. Associated values ile bu, alt sınıflar veya isteğe bağlı alanlar olmadan doğal bir şekilde uygulanır.
Apple dokümantasyonuna göre, associated values, enum'u basit bir sabitler kümesinden işlevsel dillere özgü cebirsel bir veri türüne (sum type) dönüştürür. Bu, kod ifade gücünü önemli ölçüde artırır.
Associated Values, işlevlerde olduğu gibi, durumdan sonra parantez içinde parametre adları ve türleri belirtilerek bildirilir.
enum MediaFile {
case image(width: Int, height: Int, format: String)
case video(duration: Double, codec: String)
case audio(bitrate: Int)
case unknown
}
Bir örnek oluşturulurken, associated values argümanlar olarak iletilir:
let photo = MediaFile.image(width: 1920, height: 1080, format: "jpeg")
let clip = MediaFile.video(duration: 120.5, codec: "h264")
Swift, associated values'ın sayısı veya türleri üzerinde kısıtlama getirmez. Associated values içinde generics, closure işlevleri ve diğer enum'ları kullanabilirsiniz. Bu, karmaşık iç içe yapılar oluşturmayı mümkün kılar.
Associated values parametre adları, bir örnek oluşturulurken argüman etiketleri olarak kullanılır — bu, kod okunabilirliğini artırır. Switch ile çıkarım sırasında adlar, her değerin anlamını netleştirerek dokümantasyon görevi görür. Bu yaklaşım, kodu kendi kendini belgeleyen hale getirir ve veri eşleştirme sırasında hata olasılığını azaltır. Bu, büyük iOS uygulamalarının takım geliştirmesinde özellikle değerlidir.
Switch, associated values'ı çıkarmanın birincil yoludur. Değerler, let veya var aracılığıyla sabitlere veya değişkenlere bağlanır.
func describe(_ file: MediaFile) -> String {
switch file {
case .image(let w, let h, let fmt):
return "Image \(w)x\(h) .\(fmt)"
case .video(let duration, let codec):
return "Video \(duration)s, \(codec)"
case .audio(let bitrate):
return "Audio \(bitrate)kbps"
case .unknown:
return "Unknown format"
}
}
Swift kısmi eşleme destekler — associated values için somut değerler belirtebilirsiniz:
switch file {
case .image(let w, let h, "png"):
print("PNG görüntüsü \(w)x\(h)")
case .image(1920, 1080, _):
print("Full HD görüntü")
default:
break
}
Joker karakter (_) kullanmak gereksiz associated values'ı yok saymaya olanak tanır ve durumlardaki sabitler, belirli değerlerle eşleşmeyi kontrol etmenizi sağlar.
Birçok acemi geliştirici associated values ile raw values'ı karıştırır. Bunlar farklı kullanım durumlarına sahip farklı mekanizmalardır.
| Özellik | Raw Values | Associated Values |
|---|---|---|
| Veri Türü | Tüm durumlar için tek tür | Her durum için farklı türler |
| Atama Zamanı | Enum bildiriminde | Örnek oluşturulurken |
| Zorunluluk | Tüm durumların bir değeri vardır | Bazı durumlar değersiz olabilir |
| Uyumluluk | Karşılıklı dışlayıcı — aynı anda kullanılamaz | |
Swift Evolution'a göre, associated values, enum yeniden tasarımının bir parçası olarak Swift 2.0'da tanıtılmıştır. Her durumun kendi imzasına sahip ayrı bir kurucu olduğu türlere cebirsel bir yaklaşım sağlarlar.
Associated Values, gerçek iOS projelerinde aktif olarak kullanılır. Üç tipik senaryoyu inceleyelim.
enum APIResponse<T: Codable> {
case success(data: T, cached: Bool)
case failure(error: Error, retryAvailable: Bool)
case loading(progress: Double)
}
enum ViewState<T> {
case idle
case loading(message: String)
case loaded(data: T)
case error(message: String, retryAction: () -> Void)
}
Associated values ile enum, durum makineleri için güçlü bir araç haline gelir: her durum bir durumdur, associated values bu durumun parametreleridir. Derleyici, tüm geçişlerin işlendiğini garanti eder.
Switch olmadan tek bir durumu kontrol etmek için if case veya guard case kullanın. Yalnızca bir seçeneği işlemeniz gerektiğinde bu daha derli topludur.
let error = NetworkError.timeout(seconds: 30)
if case .timeout(let seconds) = error {
print("\(seconds)s sonra istek zaman aşımına uğradı")
}
guard case .httpError(let code, _) = error else {
return
}
print("\(code) kodlu HTTP hatası")
Sıkça Sorulan Sorular
Evet, bir durum associated values'a sahip olmayabilir — örneğin, case unknown. Bu tür durumlar, ek veri olmadan normal enum durumları gibi davranır. Bu, işaretleyici durumlar için uygundur.
Swift, associated values'a sahip enum'lar için otomatik olarak Equatable oluşturmaz (Swift 4.2+ öncesi). Açık bir Equatable uygulaması ekleyin veya her durumu sırayla karşılaştırmak için switch kullanın.
Evet, indirect enum'larda associated values, ağaçlar ve bağlı listeler oluşturmak için standart bir tekniktir. Bir durum, indirect ile işaretlenmiş aynı türde bir associated value içerebilir.
Associated Values tür güvenlidir — her durum yalnızca kendi verilerine sahip olmayı garanti eder. İsteğe bağlı özelliklere sahip bir struct'ta, her örnek tüm alanları içerir ve çalışma zamanı nil kontrolleri gerekir.
Swift, associated values'a sahip enum'lar için otomatik olarak Codable oluşturmaz. Özel kodlama anahtarları kullanarak durumlar üzerinde switch aracılığıyla manuel encode ve decode uygulaması gerekir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun