Typealias is een mechanisme om aliassen voor bestaande typen te creëren, dat het lezen van de code vergemakkelijkt, de ondersteuning van projecten verbetert en het mogelijk maakt om abstracties te hergebruiken.
Geschiedenis van de vraag
Typealias komt voort uit veel andere talen, zoals typedef in C. In Swift is typealias ingebouwd in het type-systeem en wordt het actief toegepast voor generieke types en protocollen met associated type.
Probleem
In grote projecten komen vaak lange generieke types, samengestelde types, composities en geneste types voor. Zonder aliassen worden zulke constructies onleesbaar en bemoeilijken ze het onderhoud van de applicatie.
Oplossing
Het declareren van typealias voor vaak gebruikte of complexe types maakt de code eenvoudiger, begrijpelijker en gestructureerder. Typealias wordt ook vaak gebruikt om aliassen voor protocollen met associatedtype te definiëren, zodat opgedrongen beperkingen van protocollen als typen kunnen worden omzeild.
Codevoorbeeld:
typealias JSON = [String: Any] typealias CompletionHandler = (Result<Int, Error>) -> Void typealias StringDictionary = Dictionary<String, String> typealias Handler = (String) -> Void
Belangrijke kenmerken:
Kan je een nieuw type maken met typealias?
Nee, typealias maakt geen nieuw type — het is gewoon een alias, een volledige synoniem voor een bestaand type, en de compiler beschouwt ze als hetzelfde type.
typealias Age = Int let a: Age = 25 let b: Int = a // Alles is correct
Zal typealias werken op het niveau van typeveiligheid?
Nee, typealias beschermt niet tegen het doorgeven van een ander type: JSON en [String: Any] zijn uitwisselbaar. Voor controle of scheiding van logica moeten aparte structuren/wrapper-objecten worden gebruikt, en geen typealias.
typealias UserID = Int typealias ProductID = Int func logId(_ id: UserID) {} let productId: ProductID = 42 logId(productId) // De compiler genereert geen fout!
Kan je typealias declareren binnen protocollen of generieke types?
Ja, binnen protocollen worden vaak associatedtype of typealias gedeclareerd, vooral voor complexe generieke types of op maat gemaakte interfaces.
protocol DataSource { associatedtype Item typealias CompletionBlock = (Item) -> Void }
Alle identificators van modellen zijn gedeclareerd via typealias als Int:
typealias UserID = Int typealias ProductID = Int func deleteUser(id: UserID) func deleteProduct(id: ProductID)
Voordelen:
Voor complexe generieke types of resultaten van type closure worden typealias gedeclareerd:
typealias Completion<T> = (Result<T, Error>) -> Void let completion: Completion<String>
Voordelen: