Typealias — deklarace ve Swift, která vytváří alternativní název pro existující typ bez definování nového. Alias je plně ekvivalentní původnímu typu ve fázi kompilace — kompilátor dosadí původní typ všude, kde je typealias použit. Podle Swift Language Guide (2025) se typealias používá pro zkracování dlouhých signatur, abstrahování vnitřních typů pomocí associatedtype v protokolech a zjednodušování složitých generických parametrů. Na rozdíl od obalu typu (wrapper) typealias nepřidává typovou bezpečnost — je to pouze alias, který není typovým systémem rozlišován.
Hlavní body
typealias NewName = ExistingType — lze deklarovat na jakékoli úrovni (globální, lokální, uvnitř typu)typealias Result = Swift.Result<Data, Error>typealias Handler = (Int) -> VoidTypealias — je deklarace ve Swift, která zavádí alternativní název pro existující typ. Po deklarování typealias lze nové jméno použít všude, kde je očekáván původní typ — kompilátor je považuje za identické. Typealias nepřidává sémantickou izolaci: hodnotu typu UserID (typealias pro String) lze předat funkci očekávající String bez chyby.
Hlavní účely typealias — zkracování dlouhých názvů, dokumentování účelu typu a abstrahování konkrétní implementace. Například typealias JSON = [String: Any] výslovně uvádí, že slovník je používán jako JSON struktura, a typealias Completion = (Result<Data, Error>) -> Void přeměňuje složitou signaturu closure na čitelný typ.
Podle Swift.org (2025) je typealias široce používán ve standardní knihovně. Například String — je typealias pro String (specializované Array<Character>), i když v moderních verzích Swift je tato implementace skrytá. Void — typealias pro prázdnou n-tici (), což činí signatury funkcí čitelnějšími.
Používejte typealias k dokumentování sémantiky typu, ale pamatujte: to nechrání před mícháním různých konceptů stejného základního typu. Pro typově bezpečné oddělení používejte obaly (struct wrapper).
Typealias se deklaruje klíčovým slovem typealias, za kterým následuje nové jméno, rovnítko a existující typ. Základní tvar:
typealias Name = ExistingType
typealias UserID = Int
typealias JSONDictionary = [String: Any]
Oblast viditelnosti typealias je určena místem deklarace:
| Úroveň | Příklad | Viditelnost |
|---|---|---|
| Globální | typealias Name = String | Celý modul (s ohledem na access control) |
| Uvnitř typu | struct User { typealias ID = Int } | User.ID — přístup přes typ |
| Uvnitř funkce | func f() { typealias Local = Int } | Pouze uvnitř funkce |
| Uvnitř protokolu | protocol P { associatedtype T } | Specifikováno při potvrzení |
Typealias uvnitř typu (například User.ID) — běžný vzor pro seskupování souvisejících aliasů. To zlepšuje jmenný prostor: Order.ID a User.ID — obojí Int, ale jsou čteny jako různé koncepty. Přístup k vnořenému typealias je přes User.ID nebo přes tečku, pokud je typ znám.
Jedno z nejčastějších použití typealias — zjednodušování signatur closure. Typy closure ve Swift mohou být těžkopádné, zejména s Optional a generickými parametry. Typealias přeměňuje (Data?, Error?) -> Void na čitelný FetchResultHandler:
typealias FetchResultHandler = (Data?, Error?) -> Void
func fetchUser(id: Int, completion: FetchResultHandler) {
// síťový požadavek
completion(data, nil)
}
Podle Ray Wenderlich Style Guide, typealias pro closure zvyšuje čitelnost signatur metod, zejména v delegovacích prototypech a callback vzorech. Vyhněte se však nadměrnému počtu aliasů — pokud je closure použit na jednom místě, lze jej deklarovat inline.
Standardní knihovna Swift aktivně používá tuto techniku. Například DispatchQueue.WorkItem — je typealias pro DispatchWorkItem, i když zvenčí vypadá jako samostatný typ. Typealias pro closure je nástroj čitelnosti, nezneužívejte jej: 3–5 closure aliasů na modul — rozumný limit.
Typealias může zahrnovat generické parametry, vytvářející specializované verze zobecněných typů. To je zvláště užitečné při práci s Result, Publisher a dalšími generickými typy ze standardní knihovny a Combine:
typealias FetchResult = Result<Data, Error>
typealias AnyPublisherOfData = AnyPublisher<Data, Error>
func loadData() -> FetchResult {
// načítání dat
}
Lze také vytvářet typealias s vlastními generickými parametry, které jsou přesměrovány do původního typu:
typealias NetworkResult<T> = Result<T, NetworkError>
func fetchUser() -> NetworkResult<User> {
// ...
}
Důležité pravidlo: typealias nemůže přidávat nová generická omezení (where clauses) — pouze přesměrovává parametry do původního typu. Pokud jsou potřebná další omezení, vytvořte generickou strukturu nebo třídu. Podle Swift by Sundell (2024), typealias s generic — ideální způsob, jak zkrátit opakující se signatury v projektech aktivně používajících Combine, Result a async/await.
Associatedtype — je typealias deklarovaný uvnitř protokolu, který definuje přidružený typ. Na rozdíl od běžného typealias, associatedtype není vázán na konkrétní typ ve fázi deklarace — je konkretizován každým typem potvrzujícím protokol:
protocol Container {
associatedtype Item
var count: Int { get }
mutating func append(_ item: Item)
}
struct IntBox: Container {
typealias Item = Int
// implementace
}
struct StringBox: Container {
typealias Item = String
// implementace
}
Associatedtype dává protokolům flexibilitu generických typů bez specifikace konkrétního typu v místě deklarace. To je základem mnoha Swift vzorů: Collection (Element), IteratorProtocol (Element), Identifiable (ID). Kompilátor může odvodit associatedtype automaticky z implementace, proto je explicitní typealias Item = Int často vynecháváno — Swift odvodí Item jako Int z parametru metody append.
Podle Swift Evolution SE-0195 (2022) byly zavedeny opaque result types (some Container) pro práci s protokoly obsahujícími associatedtype — to vyřešilo problém PAT (protocol with associated types), které nebylo možné použít jako typ proměnné.
Klíčový rozdíl: typealias — je jen jiné jméno pro existující typ, zatímco obal (wrapper) — nový typ, sémanticky izolovaný od originálu. Pokud deklarujete typealias UserID = Int, pak UserID a Int jsou zaměnitelné — funkce očekávající Int přijme UserID bez chyby.
Obal se vytváří přes struct a poskytuje skutečnou typovou bezpečnost:
struct UserID: RawRepresentable {
let rawValue: Int
}
struct OrderID: RawRepresentable {
let rawValue: Int
}
// Chyba kompilace: nelze předat OrderID tam, kde je očekáváno UserID
Podle Point-Free (2025) jsou obaly preferovány, když jsou různé koncepty reprezentovány jedním základním typem (UserID vs OrderID). Typealias je ospravedlněn, když cílem je čitelnost bez izolace: zkrácení dlouhého názvu, dokumentování sémantiky, abstrahování implementace přes associatedtype. Vyberte typealias pro pohodlí čtení, obal — pro typovou bezpečnost.
Často kladené otázky
Typealias — alias pro konkrétní existující typ. Associatedtype je deklarován uvnitř protokolu a je konkretizován každým typem potvrzujícím protokol — různé typy mohou používat různý associatedtype pro stejný protokol.
Ne, typealias — je jen alternativní název. Kompilátor jej nahradí původním typem ve fázi kompilace. Pro vytvoření nového, sémanticky izolovaného typu použijte struct obal nebo enum s rawValue.
Ano, typealias může zahrnovat generické parametry: typealias Result<T> = Swift.Result<T, Error>. Generické parametry jsou přesměrovány do původního typu. Where-omezení nelze přidat — k tomu použijte generickou strukturu.
Na jakékoli úrovni: globální (v souboru), uvnitř typu (struct/class/enum), uvnitř funkce, uvnitř protokolu (jako associatedtype). Oblast viditelnosti je určena místem deklarace — globální typealias jsou viditelné v celém modulu, lokální — pouze ve svém rozsahu.
Typealias zvolte pro zkracování dlouhých názvů a dokumentování sémantiky, když je zaměnitelnost s původním typem bezpečná. Obal (struct) — když je třeba zabránit náhodnému míchání různých konceptů stejného základního typu: UserID vs ProductID.
Shrnutí
typealias NewName = ExistingType, oblasti viditelnosti — globální, uvnitř typu, uvnitř funkcetypealias Handler = (Int) -> VoidVyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také