Existenciales con any y type erasure
Utilice any Protocol, comprenda su coste de rendimiento y sepa cuándo preferir genéricos.
Existenciales con any y type erasure es una lección gratuita de Swift Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Swift Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Swift Academy incluye 4 lecciones en total.
¿Qué es un tipo existencial?
Un tipo existencial encapsula cualquier valor que cumpla con un protocolo detrás de una interfaz uniforme, cuya resolución se realiza en tiempo de ejecución.
protocol Drawable { func draw() }
struct Line: Drawable { func draw() { print("Line") } }
let d: any Drawable = Line()
d.draw()La palabra clave any
Swift 5.7 exige la palabra clave any delante de los nombres de protocolos usados como tipos existenciales para hacer explícito el encapsulamiento.
func render(_ shape: any Drawable) {
shape.draw()
}
render(Line())Coste de los tipos existenciales
Los tipos existenciales usan asignación en el montón y despacho dinámico, lo que puede ser más lento que los genéricos con despacho estático.
// Existential – dynamic dispatch, potential heap alloc
var shapes: [any Drawable] = [Line(), Line()]
// Generic – static dispatch, no boxing
func drawGeneric<T: Drawable>(_ s: T) { s.draw() }El problema de los PAT y los tipos existenciales
Los protocolos con tipos asociados (PAT) no pueden usarse como existenciales independientes sin aplicar borrado de tipos.
protocol Container { associatedtype Item }
// var c: any Container // Swift 5.7 allows with "any" but loses Item infoPatrón de borrado de tipos
Un contenedor con borrado de tipos encapsula un tipo concreto detrás de una estructura y oculta el tipo concreto.
struct AnyDrawable: Drawable {
private let _draw: () -> Void
init<D: Drawable>(_ d: D) { _draw = d.draw }
func draw() { _draw() }
}AnySequence y AnyPublisher
La biblioteca estándar de Swift y Combine incluyen contenedores con borrado de tipos como AnySequence y AnyPublisher.
import Combine
let subject = PassthroughSubject<Int, Never>()
let pub: AnyPublisher<Int, Never> = subject.eraseToAnyPublisher()eraseToAnyPublisher()
eraseToAnyPublisher() oculta la cadena concreta de publishers, de modo que el código que los usa solo depende de AnyPublisher.
func fetch() -> AnyPublisher<String, Error> {
URLSession.shared.dataTaskPublisher(for: URL(string: "https://example.com")!)
.map { String(data: $0.data, encoding: .utf8) ?? "" }
.eraseToAnyPublisher()
}Cuándo son apropiados los existenciales
Use tipos existenciales para colecciones heterogéneas o cuando el tipo exacto se desconozca en tiempo de compilación.
var widgets: [any Drawable] = [] // mixed concrete types OKPrefiera genéricos a existenciales
Cuando sea posible, sustituya los existenciales por genéricos para obtener despacho estático y mayor rendimiento.
// Prefer this:
func draw<T: Drawable>(_ item: T) { item.draw() }
// Over this:
func draw(_ item: any Drawable) { item.draw() }Apertura de existenciales
Swift 5.7+ puede «abrir» un existencial al llamar a una función genérica y extraer automáticamente el tipo subyacente.
func drawGeneric<T: Drawable>(_ d: T) { d.draw() }
let d: any Drawable = Line()
drawGeneric(d) // compiler opens the existential automaticallyBorrado de tipos frente a tipos opacos
El borrado de tipos oculta el tipo para permitir un uso heterogéneo; los tipos opacos conservan la identidad para un único tipo de retorno coherente.
let erased: any Drawable = Line() // runtime type unknown
let opaque: some Drawable = Line() // compile-time fixed typeComprobación rápida
¿Cuál es el principal coste de rendimiento de los tipos existenciales?
Resumen de la lección
Los existenciales (any Protocol) permiten el polimorfismo en tiempo de ejecución, a costa del despacho dinámico. El borrado de tipos encapsula los tipos concretos detrás de una interfaz estable. Prefiera genéricos para obtener rendimiento y use existenciales para colecciones heterogéneas.
Aprende Swift con un tutor de IA — gratis
Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.
- Cursos
- 122
- Lecciones
- 409
Preguntas frecuentes
¿La lección «Existenciales con any y type erasure» es gratis?
Sí — el texto completo de «Existenciales con any y type erasure» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Swift Academy, actualiza a CoddyKit PRO. El curso de Swift Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Existenciales con any y type erasure»?
Utilice any Protocol, comprenda su coste de rendimiento y sepa cuándo preferir genéricos. Practicas Swift Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Swift Academy?
No se requiere experiencia previa. Swift Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Existenciales con any y type erasure»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Swift Academy?
Sí. Cada lección de Swift Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Restricciones genéricas y cláusulas where
- Tipos opacos con la palabra clave some
- Existenciales con any y type erasure
- Tipos asociados principales y throws tipados