Swift Academy · Lección

Existenciales con any y type erasure

Utilice any Protocol, comprenda su coste de rendimiento y sepa cuándo preferir genéricos.

Lección 3 de 413 pasos

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 info

Patró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 OK

Prefiera 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 automatically

Borrado 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 type

Comprobació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.

Gratis para empezar

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

  1. Restricciones genéricas y cláusulas where
  2. Tipos opacos con la palabra clave some
  3. Existenciales con any y type erasure
  4. Tipos asociados principales y throws tipados
← Volver a Swift Academy