Typealias, Swift'te yeni bir tür tanımlamadan mevcut bir tür için alternatif bir ad oluşturan bir bildirimdir. Takma ad, derleme zamanında orijinal türle tamamen eşdeğerdir — derleyici, typealias'in kullanıldığı her yerde orijinal türü yerine koyar. Swift Language Guide'a (2025) göre typealias, uzun imzaları kısaltmak, protokollerde associatedtype aracılığıyla iç türleri soyutlamak ve karmaşık generic parametreleri basitleştirmek için kullanılır. Tür sarmalayıcısının (wrapper) aksine, typealias tür güvenliği eklemez — tür sistemi tarafından ayırt edilmeyen sadece bir takma addır.
Temel Noktalar
typealias NewName = ExistingType — herhangi bir düzeyde bildirilebilir (genel, yerel, bir tür içinde)typealias Result = Swift.Result<Data, Error>typealias Handler = (Int) -> VoidTypealias, Swift'te mevcut bir tür için alternatif bir ad sunan bir bildirimdir. Bir typealias bildirdikten sonra, yeni ad, orijinal türün beklendiği her yerde kullanılabilir — derleyici onları özdeş olarak ele alır. Typealias anlamsal izolasyon eklemez: UserID türündeki (String için typealias) bir değer, hata olmadan String bekleyen bir işleve aktarılabilir.
Typealias'in temel amaçları, uzun adları kısaltmak, bir türün amacını belgelemek ve somut uygulamayı soyutlamaktır. Örneğin, typealias JSON = [String: Any] bir sözlüğün JSON yapısı olarak kullanıldığını açıkça belirtir ve typealias Completion = (Result<Data, Error>) -> Void karmaşık bir closure imzasını okunabilir bir türe dönüştürür.
Swift.org'a (2025) göre typealias, standart kütüphanede yaygın olarak kullanılır. Örneğin, String, String için bir typealias'tir (uzmanlaşmış bir Array<Character>). Modern Swift sürümlerinde bu uygulama gizlidir. Void, boş demet () için bir typealias'tir ve işlev imzalarını daha okunabilir hale getirir.
Bir türün anlambilimini belgelemek için typealias kullanın, ancak unutmayın: aynı temel türün farklı kavramlarının karışmasına karşı koruma sağlamaz. Tür güvenli ayırma için sarmalayıcılar (struct wrapper) kullanın.
Typealias, typealias anahtar sözcüğüyle bildirilir, ardından yeni ad, eşit işareti ve mevcut tür gelir. Temel biçim:
typealias Name = ExistingType
typealias UserID = Int
typealias JSONDictionary = [String: Any]
Bir typealias'in kapsamı, bildirildiği yere göre belirlenir:
| Düzey | Örnek | Görünürlük |
|---|---|---|
| Genel | typealias Name = String | Tüm modül (erişim kontrolüne tabi) |
| Bir tür içinde | struct User { typealias ID = Int } | User.ID — tür üzerinden erişilebilir |
| Bir işlev içinde | func f() { typealias Local = Int } | Sadece işlev içinde |
| Bir protokol içinde | protocol P { associatedtype T } | Benimsendiğinde belirtilir |
Bir tür içindeki Typealias (örneğin, User.ID) ilgili takma adları gruplamak için yaygın bir kalıptır. Bu, ad alanını iyileştirir: Order.ID ve User.ID her ikisi de Int'tir, ancak farklı kavramlar olarak okunur. İç içe typealias'e erişim User.ID aracılığıyla veya tür biliniyorsa nokta notasyonuyla yapılır.
Typealias'in en yaygın kullanımlarından biri, closure imzalarını basitleştirmektir. Swift'teki closure türleri, özellikle Optional ve generic parametrelerle hantal olabilir. Typealias, (Data?, Error?) -> Void şeyini okunabilir bir FetchResultHandler'a dönüştürür:
typealias FetchResultHandler = (Data?, Error?) -> Void
func fetchUser(id: Int, completion: FetchResultHandler) {
// network request
completion(data, nil)
}
Ray Wenderlich Stil Kılavuzu'na göre, closure'lar için typealias, özellikle delegasyon protokollerinde ve callback kalıplarında yöntem imzalarının okunabilirliğini artırır. Ancak aşırı takma addan kaçının — bir closure tek bir yerde kullanılıyorsa, satır içi bildirilebilir.
Swift standart kütüphanesi bu yaklaşımı aktif olarak kullanır. Örneğin, DispatchQueue.WorkItem, DispatchWorkItem için bir typealias'tir, ancak dışarıdan ayrı bir tür gibi görünür. Closure'lar için Typealias bir okunabilirlik aracıdır — aşırıya kaçmayın: modül başına 3–5 closure takma adı makul bir sınırdır.
Typealias, generic parametreler içerebilir ve generic türlerin özelleşmiş sürümlerini oluşturur. Bu, özellikle Result, Publisher ve standart kütüphane ile Combine'daki diğer generic türlerle çalışırken kullanışlıdır:
typealias FetchResult = Result<Data, Error>
typealias AnyPublisherOfData = AnyPublisher<Data, Error>
func loadData() -> FetchResult {
// data loading
}
Ayrıca, orijinal türde yönlendirilen özel generic parametrelere sahip typealias oluşturabilirsiniz:
typealias NetworkResult<T> = Result<T, NetworkError>
func fetchUser() -> NetworkResult<User> {
// ...
}
Önemli bir kural: typealias yeni generic kısıtlamalar (where cümleleri) ekleyemez — yalnızca parametreleri orijinal türde yönlendirir. Ek kısıtlamalar gerekirse, generic bir struct veya class oluşturun. Swift by Sundell'e (2024) göre, generic'lerle typealias, Combine, Result ve async/await'i yoğun olarak kullanan projelerde tekrarlayan imzaları kısaltmak için ideal bir yöntemdir.
Associatedtype, bir protokol içinde bildirilen ve ilişkili bir türü tanımlayan typealias'tir. Normal typealias'in aksine, associatedtype bildirim anında belirli bir türe bağlı değildir — protokolü benimseyen her tür tarafından belirtilir:
protocol Container {
associatedtype Item
var count: Int { get }
mutating func append(_ item: Item)
}
struct IntBox: Container {
typealias Item = Int
// implementation
}
struct StringBox: Container {
typealias Item = String
// implementation
}
Associatedtype, protokollere bildirim noktasında somut bir tür belirtmeden generic türlerin esnekliğini verir. Bu, birçok Swift kalıbının temelidir: Collection (Element), IteratorProtocol (Element), Identifiable (ID). Derleyici, associatedtype'i uygulamadan otomatik olarak çıkarabilir, bu nedenle açık bir typealias Item = Int genellikle atlanır — Swift, append yönteminin parametresinden Item'i Int olarak çıkarır.
Swift Evolution SE-0195'e (2022) göre, associatedtype içeren protokollerle çalışmak için opak sonuç türleri (some Container) tanıtıldı — bu, bu tür protokollerin değişken türü olarak kullanılmasını engelleyen PAT (ilişkili türlere sahip protokol) sorununu çözdü.
Temel fark: Typealias mevcut bir tür için sadece başka bir addır, oysa sarmalayıcı (wrapper) orijinalden anlamsal olarak izole edilmiş yeni bir tür. typealias UserID = Int bildirirseniz, UserID ve Int birbiriyle değiştirilebilir — Int bekleyen bir işlev, hata olmadan UserID'yi kabul eder.
Bir sarmalayıcı struct aracılığıyla oluşturulur ve gerçek tür güvenliği sağlar:
struct UserID: RawRepresentable {
let rawValue: Int
}
struct OrderID: RawRepresentable {
let rawValue: Int
}
// Compilation error: cannot pass OrderID where UserID is expected
Point-Free'e (2025) göre, farklı kavramlar aynı temel türle (UserID vs OrderID) temsil edildiğinde sarmalayıcılar tercih edilir. Typealias, amaç izolasyon olmadan okunabilirlik olduğunda haklıdır: uzun adları kısaltmak, anlambilimi belgelemek, associatedtype aracılığıyla uygulamayı soyutlamak. Okuma kolaylığı için typealias'i, tür güvenliği için sarmalayıcıyı seçin.
Sıkça Sorulan Sorular
Typealias belirli bir mevcut türün takma adıdır. Associatedtype bir protokol içinde bildirilir ve protokolü benimseyen her tür tarafından belirtilir — farklı türler aynı protokol için farklı associatedtype kullanabilir.
Hayır, typealias sadece alternatif bir addır. Derleyici, derleme zamanında onu orijinal türle değiştirir. Yeni, anlamsal olarak izole edilmiş bir tür oluşturmak için struct sarmalayıcı veya rawValue ile enum kullanın.
Evet, typealias generic parametreler içerebilir: typealias Result<T> = Swift.Result<T, Error>. Generic parametreler orijinal türde yönlendirilir. Where kısıtlamaları eklenemez — bunun için generic bir struct kullanın.
Herhangi bir düzeyde: genel (bir dosyada), bir tür içinde (struct/class/enum), bir işlev içinde, bir protokol içinde (associatedtype olarak). Kapsam, bildirim konumuna göre belirlenir — genel typealias tüm modülde görünür, yerel olanlar yalnızca kendi kapsamları içinde.
Orijinal türle değişebilirliğin güvenli olduğu durumlarda, uzun adları kısaltmak ve anlambilimi belgelemek için typealias seçin. Aynı temel türün (UserID vs ProductID) farklı kavramlarının yanlışlıkla karışmasını önlemeniz gerektiğinde bir sarmalayıcı (struct) seçin.
Özet
typealias NewName = ExistingType, kapsamlar — genel, bir tür içinde, bir işlev içindetypealias Handler = (Int) -> VoidAnahtar 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