0Pricing
Swift Academy · Lección

any P (existencial): ventajas y desventajas de la distribución dinámica

Use any P para almacenar o pasar conformantes heterogéneos detrás de un protocolo. Comprenda la distribución dinámica, el boxing y las limitaciones de los requisitos con associated types / Self .

any P (existencial): ventajas y desventajas de la distribución dinámica es una lección gratuita de Swift Academy en CoddyKit. Esta es la lección 2 de 3. 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 3 lecciones en total.

¿Qué es un existencial?

Los existenciales (any P) contienen cualquier valor que sea conforme con P. Permiten almacenar valores heterogéneos y usar despacho dinámico, aunque tienen algunas restricciones.

  • Ideales para colecciones mixtas
  • Despacho dinámico mediante tablas de testigos del protocolo
  • Limitaciones con tipos asociados/Self

Colección heterogénea

any Shape permite almacenar juntos conformantes diferentes y llamar a métodos del protocolo mediante despacho dinámico.

protocol Shape { func area() -> Double }

struct Circle: Shape { let r: Double; func area() -> Double { .pi * r * r } }
struct Square: Shape { let s: Double; func area() -> Double { s * s } }

// Heterogeneous array using ANY Shape
let shapes: [any Shape] = [Circle(r: 1), Square(s: 2), Circle(r: 0.5)]
let total = shapes.reduce(0) { $0 + $1.area() }   // dynamic dispatch
print(String(format: "%.2f", total))

Límite de la interfaz

Los existenciales exponen únicamente la interfaz del protocolo. Para usar métodos exclusivos del tipo concreto se requiere un downcasting (opcional y comprobado en tiempo de ejecución).

extension Circle { func diameter() -> Double { 2 * r } }

let mixed: [any Shape] = [Circle(r: 1), Square(s: 3)]
print(mixed[0].area())            // OK: in protocol
// print(mixed[0].diameter())     // ❌ Not visible via any Shape (commented)
// You'd need a type check / downcast:
if let c = mixed[0] as? Circle { print(c.diameter()) }

Advertencia sobre los tipos asociados

Los existenciales no pueden transportar directamente tipos asociados desconocidos ni requisitos referidos a Self. Use type erasure o fije el tipo asociado mediante un envoltorio.

// Protocols with associated types/Self constraints can be hard to use as existentials.
protocol Parser {
    associatedtype Output
    func parse(_ s: String) -> Output
}

// let p: any Parser = ...     // ❌ Not directly usable: Output is unknown
// Workarounds: type erasure or constrain Output to a specific type in wrappers.

Cómo elegir el estilo del parámetro

Existencial: heterogéneo y flexible. Genérico: homogéneo, más rápido y comprobado en tiempo de compilación. Elija según la necesidad.

// Existential: accepts any mix of Shapes (dynamic dispatch)
func totalAreaExistential(_ xs: [any Shape]) -> Double {
    xs.reduce(0) { $0 + $1.area() }
}

// Generic (homogeneous): static dispatch; one concrete Shape type per call
func totalAreaGeneric<S: Sequence, T: Shape>(_ xs: S) -> Double
where S.Element == T {
    xs.reduce(0) { $0 + $1.area() }
}

print(totalAreaExistential([Circle(r:1), Square(s:2)]))  // mixed OK
print(totalAreaGeneric([Circle(r:1), Circle(r:2)]))      // homogeneous only
// totalAreaGeneric([Circle(r:1), Square(s:2)])          // ❌ different types

Cuándo usar any P

Directrices:

  • Use any P para almacenar elementos heterogéneos y para el polimorfismo en tiempo de ejecución.
  • Prefiera los genéricos por su rendimiento y sus garantías estáticas cuando los elementos sean homogéneos.
  • Evite los existenciales para protocolos con tipos asociados/Self, a menos que aplique type erasure o use un envoltorio.

Ventaja de los existenciales

Comprobación rápida: ¿Qué permite any P?

Resumen

Resumen: any P = contenedor existencial para valores conformes con un protocolo. Permite polimorfismo heterogéneo mediante despacho dinámico, pero oculta las API exclusivas del tipo concreto y presenta dificultades con los tipos asociados/Self.

Preguntas frecuentes

¿La lección «any P (existencial): ventajas y desventajas de la distribución dinámica» es gratis?

Sí — el texto completo de «any P (existencial): ventajas y desventajas de la distribución dinámica» 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 3 lecciones en total.

¿Qué aprenderé en «any P (existencial): ventajas y desventajas de la distribución dinámica»?

Use any P para almacenar o pasar conformantes heterogéneos detrás de un protocolo. Comprenda la distribución dinámica, el boxing y las limitaciones de los requisitos con associated types / Self . 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 2 de 3.

¿Cuánto tiempo toma la lección «any P (existencial): ventajas y desventajas de la distribución dinámica»?

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. some P (tipos de resultado opacos): ocultar tipos concretos
  2. any P (existencial): ventajas y desventajas de la distribución dinámica
  3. Elegir entre some, any y genéricos
← Volver a Swift Academy