Los protocolos como contratos
Defina contratos de comportamiento independientes de los tipos.
Los protocolos como contratos es una lección gratuita de Swift Academy en CoddyKit. Esta es la lección 1 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 un protocolo?
Un protocolo define un esquema de métodos, propiedades y otros requisitos que debe implementar un tipo que se ajuste a él. Es un contrato: cualquier tipo que lo adopte promete proporcionar todo lo que declara el protocolo.
protocol Greetable {
var name: String { get }
func greet() -> String
}Conformidad con un protocolo
Un tipo cumple un protocolo cuando lo adopta y proporciona todos sus requisitos. Aquí, una estructura satisface tanto la propiedad name como el método greet().
protocol Greetable {
var name: String { get }
func greet() -> String
}
struct Person: Greetable {
let name: String
func greet() -> String { "Hello, I am " + name }
}
let p = Person(name: "Ada")
print(p.greet())Requisitos de propiedades
Los protocolos especifican si una propiedad debe ser de solo lectura ({ get }) o de lectura y escritura ({ get set }). Una propiedad almacenada o calculada puede satisfacer un requisito de solo lectura.
protocol Identifiable {
var id: String { get }
}
struct User: Identifiable {
let id: String
}
print(User(id: "u-1").id)Requisitos de métodos
Los requisitos de métodos indican el nombre, los parámetros y el tipo de retorno, pero no incluyen un cuerpo. Los tipos que cumplen el protocolo proporcionan la implementación.
protocol Shape {
func area() -> Double
}
struct Square: Shape {
let side: Double
func area() -> Double { side * side }
}
print(Square(side: 3).area())Requisitos mutating
En los tipos por valor, los métodos que modifican self deben marcarse con mutating. Declare el requisito con mutating para que las estructuras puedan satisfacerlo.
protocol Toggleable {
mutating func toggle()
}
struct Switch: Toggleable {
var isOn = false
mutating func toggle() { isOn.toggle() }
}
var s = Switch()
s.toggle()
print(s.isOn)Protocolos como tipos
Un protocolo es un tipo de primera clase. Puede usarlo para variables, parámetros y valores de retorno, aceptando cualquier valor que cumpla el protocolo.
protocol Animal { func sound() -> String }
struct Dog: Animal { func sound() -> String { "Woof" } }
struct Cat: Animal { func sound() -> String { "Meow" } }
let animals: [Animal] = [Dog(), Cat()]
for a in animals { print(a.sound()) }Polimorfismo mediante protocolos
Al llamar a un método de protocolo, el despacho se dirige al tipo concreto que hay detrás del valor. Esto permite escribir código que funcione con muchos tipos mediante un solo contrato.
protocol Describable { func describe() -> String }
struct Book: Describable { let t: String; func describe() -> String { "Book: " + t } }
struct Film: Describable { let t: String; func describe() -> String { "Film: " + t } }
func show(_ d: Describable) { print(d.describe()) }
show(Book(t: "Swift"))
show(Film(t: "Inception"))Requisitos de inicializadores
Los protocolos pueden exigir inicializadores. Las clases deben marcar la implementación con required para que las subclases también la proporcionen.
protocol FromInt {
init(value: Int)
}
struct Wrapper: FromInt {
let value: Int
init(value: Int) { self.value = value }
}
print(Wrapper(value: 42).value)Herencia de protocolos
Un protocolo puede heredar de uno o varios protocolos, añadiendo requisitos a los heredados.
protocol Named { var name: String { get } }
protocol Aged: Named { var age: Int { get } }
struct Member: Aged {
let name: String
let age: Int
}
let m = Member(name: "Lin", age: 30)
print(m.name, m.age)Protocolos exclusivos para clases
Marque un protocolo con AnyObject para limitar la conformidad a las clases, lo que resulta útil para requisitos con semántica de referencia, como la delegación.
protocol Counter: AnyObject {
var count: Int { get set }
}
class Box: Counter {
var count = 0
}
let b = Box()
b.count = 5
print(b.count)Comprobación de conformidad
Use is y as? para comprobar en tiempo de ejecución si un valor cumple un protocolo.
protocol Flyer { func fly() }
struct Bird: Flyer { func fly() { print("flap") } }
struct Rock {}
let things: [Any] = [Bird(), Rock()]
for t in things {
if let f = t as? Flyer { f.fly() } else { print("grounded") }
}Comprobación rápida
Compruebe su comprensión de los requisitos de los protocolos.
Resumen
Ha aprendido que un protocolo es un contrato: declara requisitos de propiedades, métodos, mutación e inicializadores, pero no sus implementaciones. Los tipos cumplen el protocolo al satisfacer todos sus requisitos; los protocolos pueden usarse como tipos para el polimorfismo, pueden heredar de otros protocolos y pueden limitarse a clases mediante AnyObject.
Preguntas frecuentes
¿La lección «Los protocolos como contratos» es gratis?
Sí — el texto completo de «Los protocolos como contratos» 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 «Los protocolos como contratos»?
Defina contratos de comportamiento independientes de los tipos. 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 1 de 4.
¿Cuánto tiempo toma la lección «Los protocolos como contratos»?
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