Typealias es un mecanismo para crear alias para tipos existentes, lo que facilita la lectura del código, mejora el soporte de proyectos y permite reutilizar abstracciones.
Historia de la pregunta
Typealias surgió como un legado de muchos otros lenguajes, como typedef en C. En Swift, el typealias está integrado en el sistema de tipos y se utiliza activamente para tipos genéricos y protocolos con associated type.
Problema
En grandes proyectos, a menudo se encuentran tipos genéricos largos, tipos compuestos, composiciones y tipos anidados. Sin alias, estas construcciones se vuelven ilegibles y complican el soporte de la aplicación.
Solución
Declarar typealias para tipos complejos o de uso frecuente hace que el código sea más simple, comprensible y estructurado. Además, el typealias se usa a menudo para asignar alias a protocolos con associatedtype, para evitar las limitaciones de los protocolos como tipos.
Ejemplo de código:
typealias JSON = [String: Any] typealias CompletionHandler = (Result<Int, Error>) -> Void typealias StringDictionary = Dictionary<String, String> typealias Handler = (String) -> Void
Características clave:
¿Se puede crear un nuevo tipo mediante typealias?
No, typealias no crea un nuevo tipo, es solo un alias, una completa sinonimia de un tipo existente, y el compilador los considera el mismo tipo.
typealias Age = Int let a: Age = 25 let b: Int = a // Todo correcto
¿Funcionará typealias en el nivel de acceso a tipos (type safety)?
No, typealias no protege contra la transmisión de tipos incorrectos: JSON y [String: Any] son intercambiables. Para controlar o separar la lógica, se deben utilizar estructuras u objetos envolventes separados, no typealias.
typealias UserID = Int typealias ProductID = Int func logId(_ id: UserID) {} let productId: ProductID = 42 logId(productId) // ¡El compilador no genera error!
¿Se puede declarar typealias dentro de protocolos o tipos genéricos?
Sí, dentro de protocolos a menudo se declaran associatedtype o typealias, especialmente para tipos genéricos complejos o interfaces personalizadas.
protocol DataSource { associatedtype Item typealias CompletionBlock = (Item) -> Void }
Todos los identificadores de modelos declarados a través de typealias como Int:
typealias UserID = Int typealias ProductID = Int func deleteUser(id: UserID) func deleteProduct(id: ProductID)
Ventajas:
Para un tipo genérico complejo o un resultado de tipo closure se declara typealias:
typealias Completion<T> = (Result<T, Error>) -> Void let completion: Completion<String>
Ventajas: