Patrones de type erasure (AnySequence/AnyIterator)
Use AnySequence y AnyIterator para ocultar los tipos concretos de secuencias o iteradores, de modo que las APIs puedan devolver «una secuencia de T» sin exponer la implementación.
Patrones de type erasure (AnySequence/AnyIterator) 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.
¿Por qué usar la eliminación de tipos?
La eliminación de tipos oculta los tipos concretos detrás de un wrapper estable. Con AnySequence / AnyIterator puede devolver “una secuencia de elementos” sin exponer la estructura interna.
La limitación
Sequence tiene un tipo asociado (Element), por lo que el protocolo sin especializar no puede usarse como un tipo de valor concreto. Necesitamos un wrapper.
// Goal: return "some Sequence<Int>"
// This won't compile as a stored value type:
// let s: Sequence = [1,2,3] // Protocol with associated types
// Instead, erase the type to AnySequence<Int>.Wrapper AnySequence
AnySequence envuelve cualquier secuencia concreta (Array, Set o una personalizada) y expone un tipo uniforme, como AnySequence<Int>.
// Build an AnySequence<Int> from an Array
let a = [1, 2, 3]
let seq1: AnySequence<Int> = AnySequence(a)
// Consume like any sequence
for x in seq1 { print(x, terminator: " ") }
print("")Wrapper AnyIterator
AnyIterator envuelve un cierre que produce elementos. Envuélvalo en AnySequence para exponer una secuencia completa.
// Create an AnyIterator<Int> by hand
var i = 0
let it = AnyIterator<Int> {
// Return next number or nil to stop
guard i < 3 else { return nil }
defer { i += 1 }
return i
}
let seq2 = AnySequence(it)
for x in seq2 { print(x, terminator: " ") } // 0 1 2
print("")Tipo de retorno uniforme
La eliminación de tipos permite que una función devuelva implementaciones diferentes con un único tipo de retorno estable (AnySequence<Int>).
// Return a sequence of Int without exposing concrete type
func numbers(flag: Bool) -> AnySequence<Int> {
if flag {
// Array-based
return AnySequence([10, 20, 30])
} else {
// Lazy generated with AnyIterator
var n = 1
let it = AnyIterator<Int> {
guard n <= 3 else { return nil }
defer { n += 1 }
return n * 100
}
return AnySequence(it)
}
}
for x in numbers(flag: true) { print(x, terminator: " ") } // 10 20 30
print("")
for x in numbers(flag: false) { print(x, terminator: " ") } // 100 200 300
print("")Cuándo utilizarlo
Utilice el borrado de tipos cuando:
- Desee ocultar los detalles de implementación de secuencias o iteradores.
- Las API deban devolver el mismo tipo independientemente de sus ramas internas.
- Los genéricos queden demasiado expuestos en los límites de la API.
Notas: prefiera los genéricos por su rendimiento y claridad dentro de los módulos; utilice AnySequence/AnyIterator en los límites cuando sea necesario.
Finalidad de AnySequence
Comprobación rápida: ¿Qué ventaja le ofrece AnySequence<T>?
Resumen
Resumen: Envuelva secuencias o iteradores concretos con AnySequence / AnyIterator para borrar sus tipos y devolver «una secuencia de T» desde API flexibles.
Preguntas frecuentes
¿La lección «Patrones de type erasure (AnySequence/AnyIterator)» es gratis?
Sí — el texto completo de «Patrones de type erasure (AnySequence/AnyIterator)» 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 «Patrones de type erasure (AnySequence/AnyIterator)»?
Use AnySequence y AnyIterator para ocultar los tipos concretos de secuencias o iteradores, de modo que las APIs puedan devolver «una secuencia de T» sin exponer la implementación. 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 «Patrones de type erasure (AnySequence/AnyIterator)»?
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
- associatedtype y protocolos genéricos
- Patrones de type erasure (AnySequence/AnyIterator)
- Cuándo usar existentials (any P) frente a genéricos