Typealias: nedir, sözdizimi ve kullanımı

Yazar: IT Sectr Yayınlanma: 2026-06-20 Okuma süresi: 7 dk

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 — mevcut bir türün takma adı, yeni bir tür oluşturmaz; derleyici onu orijinaliyle değiştirir
  • Sözdizimi: typealias NewName = ExistingType — herhangi bir düzeyde bildirilebilir (genel, yerel, bir tür içinde)
  • Associatedtype — protokol içindeki typealias, protokol benimsendiğinde somutlaştırılan ilişkili bir türü tanımlar
  • Generic imzalar — typealias uzun parametreleri kısaltır: typealias Result = Swift.Result<Data, Error>
  • Closure türleri — typealias okunabilirliği artırır: typealias Handler = (Int) -> Void

Typealias Nedir?

Typealias, 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.

Sözdizimi ve Kapsamlar

Typealias, typealias anahtar sözcüğüyle bildirilir, ardından yeni ad, eşit işareti ve mevcut tür gelir. Temel biçim:

swift
typealias Name = ExistingType
typealias UserID = Int
typealias JSONDictionary = [String: Any]

Bir typealias'in kapsamı, bildirildiği yere göre belirlenir:

DüzeyÖrnekGörünürlük
Geneltypealias Name = StringTüm modül (erişim kontrolüne tabi)
Bir tür içindestruct User { typealias ID = Int }User.ID — tür üzerinden erişilebilir
Bir işlev içindefunc f() { typealias Local = Int }Sadece işlev içinde
Bir protokol içindeprotocol 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.

Closure Türleri için Typealias

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:

swift
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 ve Generic Parametreler

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:

swift
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:

swift
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.

Protokollerde Associatedtype

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:

swift
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ü.

Typealias vs Tür Sarmalayıcısı

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:

swift
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, associatedtype'den nasıl farklıdır?

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.

Typealias yeni bir tür oluşturur mu?

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.

Typealias generic parametrelerle kullanılabilir mi?

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.

Typealias nerede bildirilebilir?

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.

Sarmalayıcı yerine ne zaman typealias kullanılmalıdır?

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 — yeni bir tür oluşturmadan mevcut türün takma adı; derleyici onu orijinaliyle değiştirir
  • Sözdizimi: typealias NewName = ExistingType, kapsamlar — genel, bir tür içinde, bir işlev içinde
  • Closure türleri — typealias imzaları basitleştirir: typealias Handler = (Int) -> Void
  • Generic — typealias, Result, Publisher ve diğer generic türleri kısaltmak için generic parametreler içerebilir
  • Associatedtype — protokol içindeki typealias, her benimseyen tür tarafından belirtilir
  • Sarmalayıcıdan farkı: typealias türleri izole etmez — UserID ve Int değiştirilebilir; sarmalayıcı (struct) gerçek tür güvenliği sağlar
  • En iyi uygulama: okunabilirlik için typealias kullanın, anlamsal derleme hatalarını önlemek için sarmalayıcı kullanın

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.

Projeyi tartış

Ayrıca okuyun