Typealias, mevcut türler için takma adlar oluşturma mekanizmasıdır; bu, kodun okunabilirliğini artırır, projelerin desteklenmesini iyileştirir ve soyutlamaların yeniden kullanılmasını sağlar.
Konunun Tarihi
Typealias, C dilindeki typedef gibi birçok diğer dilden miras kalmıştır. Swift'te typealias türler sistemine entegre edilmiştir ve generic türler ile associated type'lara sahip protokoller için aktif olarak kullanılmaktadır.
Sorun
Büyük projelerde genellikle uzun generic türler, bileşen türler, kompozit türler ve iç içe geçmiş türler ile karşılaşılır. Takma adlar olmadan, bu tür yapılar okunmaz hale gelir ve uygulamanın desteklenmesini zorlaştırır.
Çözüm
Sık kullanılan veya karmaşık türler için typealias ilan etmek, kodu daha basit, daha anlaşılır ve daha yapılandırılmış hale getirir. Ayrıca, typealias genellikle associatedtype'a sahip protokollerin takma adlarını belirlemek için kullanılır, böylece türler olarak protokollerin kısıtlamalarının üstesinden gelinir.
Kod örneği:
typealias JSON = [String: Any] typealias CompletionHandler = (Result<Int, Error>) -> Void typealias StringDictionary = Dictionary<String, String> typealias Handler = (String) -> Void
Anahtar özellikler:
Typealias ile yeni bir tür yaratmak mümkün mü?
Hayır, typealias yeni bir tür yaratmaz — bu sadece mevcut bir türün takma adıdır; derleyici bunları aynı tür olarak değerlendirir.
typealias Age = Int let a: Age = 25 let b: Int = a // Her şey doğru
Typealias, türlerin erişim seviyesinde (type safety) çalışır mı?
Hayır, typealias başka türlerin iletilememesine karşı bir koruma sağlamaz: JSON ve [String: Any] birbirinin yerine kullanılabilir. Kontrol veya mantığı ayırmak için ayrı yapılar/wrapper nesneleri kullanmak gerekir, typealias değil.
typealias UserID = Int typealias ProductID = Int func logId(_ id: UserID) {} let productId: ProductID = 42 logId(productId) // Derleyici hata üretmiyor!
Protokoller veya generic türler içinde typealias ilan etmek mümkün mü?
Evet, protokoller içinde sıklıkla associatedtype veya typealias ilan edilir; özellikle karmaşık generic türler veya özel arayüzler için.
protocol DataSource { associatedtype Item typealias CompletionBlock = (Item) -> Void }
Tüm model tanımlayıcıları typealias ile Int olarak ilan edildi:
typealias UserID = Int typealias ProductID = Int func deleteUser(id: UserID) func deleteProduct(id: ProductID)
Artılar:
Karmaşık bir generic tür veya closure türü sonucu için typealias ilan edilir:
typealias Completion<T> = (Result<T, Error>) -> Void let completion: Completion<String>
Artılar: