0Pricing
Swift Academy · Lección

Conformidad condicional

Haga que un tipo cumpla genéricamente los protocolos solo cuando se cumplan las restricciones.

Conformidad condicional 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.

¿Qué es la conformidad condicional?

La conformidad condicional permite que un tipo genérico conforme con un protocolo solo cuando sus parámetros de tipo cumplen ciertas restricciones. El ejemplo clásico es que un Array es Equatable solo si su Element es Equatable.

extension Array where Element: Equatable {
    func allEqual(to x: Element) -> Bool {
        allSatisfy { $0 == x }
    }
}

Ejemplo integrado

La biblioteca estándar ya utiliza este mecanismo: [Int] es Equatable porque Int lo es. Dos matrices se comparan elemento por elemento.

let a = [1, 2, 3]
let b = [1, 2, 3]
print(a == b)

Declaración de conformidad condicional

Escriba una extensión que añada la conformidad con un protocolo mediante una cláusula where. En este caso, un contenedor conforma con Equatable solo cuando su tipo de valor también lo hace.

struct Pair<T> {
    let first: T
    let second: T
}

extension Pair: Equatable where T: Equatable {
    static func == (l: Pair, r: Pair) -> Bool {
        l.first == r.first && l.second == r.second
    }
}

print(Pair(first: 1, second: 2) == Pair(first: 1, second: 2))

Por qué importa la restricción

Sin la restricción, el compilador no podría sintetizar ==, porque comparar el valor encapsulado requiere que el propio valor se pueda comparar. La cláusula where proporciona exactamente esa garantía.

struct Box<T> { let value: T }
extension Box: Equatable where T: Equatable {}

print(Box(value: "hi") == Box(value: "hi"))
print(Box(value: 5) == Box(value: 9))

Codable condicional

Puede conformar condicionalmente con Codable. Un contenedor se puede codificar solo cuando su elemento también se puede codificar.

struct Wrapper<T> { let payload: T }
extension Wrapper: Codable where T: Codable {}

let w = Wrapper(payload: 42)
let data = try! JSONEncoder().encode(w)
print(String(data: data, encoding: .utf8)!)

Varias restricciones

Una cláusula where puede incluir varios requisitos separados por comas.

struct Stack<T> { var items: [T] = [] }

extension Stack where T: Comparable {
    func maxItem() -> T? { items.max() }
}

var s = Stack<Int>()
s.items = [3, 9, 1]
print(s.maxItem()!)

CustomStringConvertible condicional

Haga que un tipo se pueda imprimir solo cuando su contenido también lo sea, componiendo las descripciones a partir de los elementos.

struct Labeled<T> { let label: String; let value: T }

extension Labeled: CustomStringConvertible where T: CustomStringConvertible {
    var description: String { label + ": " + value.description }
}

print(Labeled(label: "Age", value: 30))

Conformidad condicional anidada

La conformidad condicional se compone: una matriz de matrices de Int es Equatable porque cada nivel encadena la restricción.

let grid1 = [[1, 2], [3, 4]]
let grid2 = [[1, 2], [3, 4]]
print(grid1 == grid2)

Restricción a otro protocolo

La cláusula where puede exigir que el elemento conforme con un protocolo definido por usted, lo que habilita el comportamiento basado en ese protocolo.

protocol Priced { var price: Double { get } }
struct Item: Priced { let price: Double }

extension Array where Element: Priced {
    var totalPrice: Double { reduce(0) { $0 + $1.price } }
}

print([Item(price: 1.5), Item(price: 2.5)].totalPrice)

Restricciones de igualdad de tipos

Puede restringir un tipo asociado a un tipo específico mediante ==. En este caso, los métodos solo se aplican a matrices de String.

extension Array where Element == String {
    func joinedUpper() -> String {
        map { $0.uppercased() }.joined(separator: "-")
    }
}

print(["a", "b", "c"].joinedUpper())

Cómo lo utiliza el compilador

La conformidad condicional permite que el compilador conceda los beneficios de un protocolo exactamente cuando son válidos, de modo que el código genérico sea seguro y максимально reutilizable.

struct Optional2<T> { let value: T? }
extension Optional2: Equatable where T: Equatable {
    static func == (l: Optional2, r: Optional2) -> Bool { l.value == r.value }
}
print(Optional2(value: 1) == Optional2(value: 1))

Comprobación rápida

Compruebe su comprensión de la conformidad condicional.

Resumen

La conformidad condicional utiliza extension Type: Protocol where ... para conceder la conformidad solo cuando los parámetros de tipo cumplen ciertas restricciones. La ha visto con Equatable, Codable y CustomStringConvertible, junto con restricciones de protocolo, restricciones de igualdad de tipos (==) y anidamiento. Mantiene los tipos genéricos seguros y reutilizables.

Preguntas frecuentes

¿La lección «Conformidad condicional» es gratis?

Sí — el texto completo de «Conformidad condicional» 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 «Conformidad condicional»?

Haga que un tipo cumpla genéricamente los protocolos solo cuando se cumplan las restricciones. 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 «Conformidad condicional»?

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. Los protocolos como contratos
  2. Implementaciones predeterminadas en extensiones
  3. Composición de protocolos
  4. Conformidad condicional
← Volver a Swift Academy