Implementaciones predeterminadas en extensiones
Proporcione comportamiento compartido mediante extensiones de protocolos.
Implementaciones predeterminadas en extensiones es una lección gratuita de Swift Academy en CoddyKit. Esta es la lección 2 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.
El problema
Los protocolos declaran requisitos, pero no proporcionan comportamiento. Si todos los tipos que cumplen el protocolo tuvieran que repetir la misma lógica, duplicaría código. Las extensiones de protocolos resuelven esto proporcionando implementaciones predeterminadas.
protocol Greeter {
func greet() -> String
}Añadir un valor predeterminado
Una extensión del protocolo puede implementar un requisito. Los tipos que cumplen el protocolo obtienen ese comportamiento automáticamente, a menos que lo redefinan.
protocol Greeter { func greet() -> String }
extension Greeter {
func greet() -> String { "Hello!" }
}
struct Robot: Greeter {}
print(Robot().greet())Redefinir el valor predeterminado
Un tipo que cumple el protocolo puede proporcionar su propia implementación, que tiene prioridad sobre el valor predeterminado de la extensión.
protocol Greeter { func greet() -> String }
extension Greeter { func greet() -> String { "Hello!" } }
struct French: Greeter {
func greet() -> String { "Bonjour!" }
}
print(French().greet())Añadir métodos adicionales
Las extensiones pueden añadir métodos completamente nuevos que no están incluidos en el protocolo. Todos los tipos que cumplen el protocolo los obtienen automáticamente.
protocol Named { var name: String { get } }
extension Named {
func loudName() -> String { name.uppercased() }
}
struct City: Named { let name: String }
print(City(name: "paris").loudName())Propiedades calculadas predeterminadas
Las extensiones también pueden proporcionar propiedades calculadas como valores predeterminados.
protocol Sized {
var width: Double { get }
var height: Double { get }
}
extension Sized {
var area: Double { width * height }
}
struct Rect: Sized { let width: Double; let height: Double }
print(Rect(width: 2, height: 5).area)Basarse en los requisitos
Una implementación predeterminada puede llamar a los propios requisitos del protocolo y combinar un comportamiento más completo a partir del contrato mínimo que debe proporcionar cada tipo.
protocol Summable {
var values: [Int] { get }
}
extension Summable {
var total: Int { values.reduce(0, +) }
}
struct Cart: Summable { let values: [Int] }
print(Cart(values: [10, 20, 30]).total)Extensiones con restricciones
Use una cláusula where para que un valor predeterminado se aplique solo cuando se cumplan condiciones adicionales. Aquí, el valor predeterminado existe únicamente cuando Self también es Equatable.
protocol Container {
associatedtype Item
var items: [Item] { get }
}
extension Container where Item: Equatable {
func contains(_ x: Item) -> Bool { items.contains(x) }
}
struct Bag: Container { let items: [Int] }
print(Bag(items: [1, 2, 3]).contains(2))Valor predeterminado y requisito juntos
Puede declarar un método en el protocolo Y proporcionar un valor predeterminado. Incluirlo en el protocolo permite el despacho dinámico a través del tipo de protocolo.
protocol Logger {
func log() -> String
}
extension Logger {
func log() -> String { "default log" }
}
struct A: Logger {}
struct B: Logger { func log() -> String { "B log" } }
let loggers: [Logger] = [A(), B()]
for l in loggers { print(l.log()) }Advertencia sobre el despacho estático
Si un método está SOLO en la extensión, y no en el protocolo, las llamadas realizadas mediante un valor cuyo tipo es el protocolo usan la versión de la extensión, aunque el tipo concreto haya definido la suya. Declárelo en el protocolo para obtener un despacho dinámico.
protocol P {}
extension P { func who() -> String { "P-default" } }
struct Q: P { func who() -> String { "Q" } }
let direct = Q()
let asP: P = Q()
print(direct.who())
print(asP.who())Reducir el código repetitivo
La combinación de una superficie mínima de requisitos y valores predeterminados completos es el núcleo del diseño orientado a protocolos: los tipos que cumplen el protocolo implementan lo mínimo y el comportamiento compartido reside en un solo lugar.
protocol Identifiable { var id: Int { get } }
extension Identifiable {
var tag: String { "ID-" + String(id) }
}
struct Order: Identifiable { let id: Int }
print(Order(id: 7).tag)Combinar varias extensiones
Puede dividir los valores predeterminados entre varias extensiones para organizar mejor el código; todas contribuyen al tipo que cumple el protocolo.
protocol Money { var cents: Int { get } }
extension Money { var dollars: Double { Double(cents) / 100 } }
extension Money { var label: String { "$" + String(format: "%.2f", dollars) } }
struct Price: Money { let cents: Int }
print(Price(cents: 1299).label)Comprobación rápida
Compruebe su comprensión de los valores predeterminados de las extensiones de protocolos.
Resumen
Las extensiones de protocolos proporcionan implementaciones predeterminadas, lo que permite que los tipos que cumplen el protocolo hereden comportamiento compartido y lo redefinan cuando sea necesario. Puede añadir métodos adicionales y propiedades calculadas, restringir los valores predeterminados con where y aplicar la regla de despacho estático frente a dinámico: declare un método en el protocolo para obtener un despacho dinámico.
Preguntas frecuentes
¿La lección «Implementaciones predeterminadas en extensiones» es gratis?
Sí — el texto completo de «Implementaciones predeterminadas en extensiones» 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 «Implementaciones predeterminadas en extensiones»?
Proporcione comportamiento compartido mediante extensiones de protocolos. 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 4.
¿Cuánto tiempo toma la lección «Implementaciones predeterminadas en extensiones»?
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
- Los protocolos como contratos
- Implementaciones predeterminadas en extensiones
- Composición de protocolos
- Conformidad condicional