0Pricing
Swift Academy · Lección

Subíndices y extensiones genéricos

Aplique restricciones a subíndices y extensiones.

Subíndices y extensiones genéricos es una lección gratuita de Swift Academy en CoddyKit. Esta es la lección 4 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.

Subíndices genéricos

Los subíndices pueden ser genéricos y tener sus propios parámetros de tipo, independientes del tipo que los contiene. Esto permite que un mismo subíndice sirva para muchos tipos de entrada.

struct Lookup {
    let data = [1, 2, 3, 4, 5]
    subscript<S: Sequence>(indices idx: S) -> [Int] where S.Element == Int {
        idx.map { data[$0] }
    }
}
print(Lookup()[indices: [0, 2, 4]])

¿Por qué subíndices genéricos?

Puede pasar un Array, un Set o un Range de índices al mismo subíndice porque acepta cualquier Sequence de Int.

struct Lookup {
    let data = [10, 20, 30, 40]
    subscript<S: Sequence>(_ idx: S) -> [Int] where S.Element == Int {
        idx.map { data[$0] }
    }
}
let l = Lookup()
print(l[0...1])
print(l[[3, 0]])

Extensiones restringidas

Una extension ... where añade miembros que solo existen cuando se cumple la restricción. Solo aparecen en el tipo para los argumentos genéricos que coinciden.

extension Array where Element: Numeric {
    func sumAll() -> Element { reduce(0, +) }
}
print([1, 2, 3].sumAll())
print([1.5, 2.5].sumAll())

Extensión para un tipo de elemento específico

Utilice where Element == String para añadir utilidades específicas de String únicamente a las matrices de cadenas.

extension Array where Element == String {
    func shout() -> [String] { map { $0.uppercased() + "!" } }
}
print(["hi", "bye"].shout())

Extensión restringida con un protocolo

Añada comportamiento cuando los elementos conformen con un protocolo personalizado.

protocol Priced { var price: Double { get } }
struct Item: Priced { let price: Double }
extension Collection where Element: Priced {
    var total: Double { reduce(0) { $0 + $1.price } }
}
print([Item(price: 2), Item(price: 3)].total)

Subíndice genérico que devuelve un opcional

Un subíndice puede ser genérico y devolver un opcional; por ejemplo, para indexar una colección de forma segura.

extension Array {
    subscript(safe i: Int) -> Element? {
        indices.contains(i) ? self[i] : nil
    }
}
print([1, 2, 3][safe: 1] ?? -1)
print([1, 2, 3][safe: 9] ?? -1)

Subíndice genérico en Dictionary

Los subíndices genéricos pueden aceptar una secuencia de claves y devolver los valores correspondientes.

extension Dictionary {
    subscript<S: Sequence>(keys ks: S) -> [Value] where S.Element == Key {
        ks.compactMap { self[$0] }
    }
}
let d = ["a": 1, "b": 2, "c": 3]
print(d[keys: ["a", "c"]].sorted())

Combinación con where en Self

Las extensiones de tipos genéricos pueden restringir el tipo encapsulado y exponer API adaptadas.

struct Stack<T> { var items: [T] = [] }
extension Stack where T: Comparable {
    var peakMax: T? { items.max() }
}
var s = Stack<Int>(); s.items = [3, 9, 1]
print(s.peakMax!)

Subíndice genérico con varios parámetros

Un subíndice puede recibir varios argumentos y sus propios parámetros de tipo al mismo tiempo.

struct Grid {
    let rows = [[1, 2], [3, 4]]
    subscript(_ r: Int, _ c: Int) -> Int { rows[r][c] }
}
print(Grid()[1, 0])

Solo lectura frente a lectura y escritura

Al igual que las propiedades, los subíndices pueden tener únicamente un get o tanto get como set para permitir modificaciones.

struct Pad {
    var values = [0, 0, 0]
    subscript(i: Int) -> Int {
        get { values[i] }
        set { values[i] = newValue }
    }
}
var p = Pad(); p[1] = 7
print(p.values)

Integración

Los subíndices genéricos y las extensiones restringidas permiten crear API expresivas y seguras para los tipos, adaptadas a los tipos de elemento o de argumento que se utilicen.

extension Array where Element: Comparable {
    subscript(topAfterSort i: Int) -> Element { sorted()[i] }
}
print([5, 1, 9, 3][topAfterSort: 0])

Comprobación rápida

Compruebe su comprensión de los subíndices genéricos y las extensiones restringidas.

Resumen

Los subíndices genéricos declaran sus propios parámetros de tipo y cláusulas where, lo que permite que un mismo subíndice acepte muchos tipos de entrada. Las extensiones restringidas (where Element: ... o == ...) añaden miembros solo cuando se cumplen las condiciones. Juntos, permiten crear API seguras para los tipos y adaptables.

Preguntas frecuentes

¿La lección «Subíndices y extensiones genéricos» es gratis?

Sí — el texto completo de «Subíndices y extensiones genéricos» 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 «Subíndices y extensiones genéricos»?

Aplique restricciones a subíndices y extensiones. 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 4 de 4.

¿Cuánto tiempo toma la lección «Subíndices y extensiones genéricos»?

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 de parámetros de tipo
  2. Cláusulas where en funciones
  3. Restricción de tipos asociados
  4. Subíndices y extensiones genéricos
← Volver a Swift Academy