Protocol en Swift es un contrato que define un conjunto de requisitos que cualquier tipo adoptante debe cumplir. Los protocolos son la base de la Programación Orientada a Protocolos (POP) — un paradigma recomendado por Apple para Swift junto con la POO clásica. Según Apple Documentation, 2026, las estructuras, clases y enums pueden adoptar protocolos, lo que hace que la arquitectura sea flexible y comprobable.
Puntos clave
Protocol es una interfaz abstracta que define lo que un tipo debe ser capaz de hacer, pero no cómo lo hace. En Swift, un protocolo es análogo a las interfaces en Java o Go, pero con capacidades adicionales.
Un protocolo puede requerir:
{ get } o { get set }Según la WWDC 2015, Apple introdujo la Programación Orientada a Protocolos como un enfoque fundamental para la arquitectura de aplicaciones Swift. A diferencia de la POO, donde la herencia de clases crea jerarquías rígidas, POP ofrece composición de protocolos. Esto brinda flexibilidad: un solo tipo puede cumplir con múltiples protocolos, obteniendo sus requisitos e implementaciones a través de extensiones.
Protocol se declara con la palabra clave protocol, un nombre y un cuerpo.
protocol Drawable {
func draw(context: CGContext)
var boundingBox: CGRect { get }
}
Un tipo adopta un protocolo mediante dos puntos después de su nombre:
struct Circle: Drawable {
let center: CGPoint
let radius: CGFloat
func draw(context: CGContext) {
context.addArc(center: center, radius: radius, ...)
}
var boundingBox: CGRect {
CGRect(x: center.x - radius, y: center.y - radius,
width: radius * 2, height: radius * 2)
}
}
Un solo tipo puede adoptar múltiples protocolos separados por comas: struct MyType: ProtocolA, ProtocolB. El compilador verifica que se cumplan todos los requisitos de cada protocolo.
Property requirements se declaran con la palabra clave var y los especificadores de acceso { get } o { get set }.
protocol UserProtocol {
var name: String { get }
var age: Int { get set }
static var maxAge: Int { get }
mutating func updateName(_ newName: String)
}
La palabra clave mutating en un protocolo indica que el método puede modificar self. Las estructuras deben implementar dicho método como mutating, mientras que las clases pueden omitirlo. Method requirements se declaran con una firma completa, incluidas las etiquetas de parámetros.
Protocol puede heredar de otro protocolo, añadiendo nuevos requisitos. Esto crea una jerarquía de contratos sin acoplamiento rígido a clases.
protocol Vehicle {
var speed: Double { get set }
func move()
}
protocol Flyable: Vehicle {
var altitude: Double { get set }
func takeOff()
}
Un tipo que adopta Flyable debe cumplir los requisitos de ambos protocolos — Vehicle y Flyable. Swift soporta herencia múltiple de protocolos: protocol A: B, C.
Protocol Composition es un mecanismo que permite especificar que un tipo debe cumplir con varios protocolos simultáneamente, sin crear un nuevo protocolo combinado.
func render(_ item: Drawable & Animatable) {
item.draw(context: ...)
item.animate(duration: 0.3)
}
La composición (&) funciona en parámetros de funciones, variables y restricciones genéricas. El compilador verifica que el tipo pasado simultáneamente satisfaga todos los protocolos. La composición se usa ampliamente en SwiftUI: some View es un genérico con composición.
Protocol Composition es preferible a crear una jerarquía de herencia: en lugar de protocol A: B, C, se puede adoptar B & C directamente. Esto brinda flexibilidad y reduce el acoplamiento. La composición es especialmente útil en parámetros de funciones y restricciones genéricas donde se necesita combinar temporalmente requisitos sin crear un protocolo intermedio. Esto reduce la cantidad de tipos auxiliares en el código.
Protocol puede usarse como tipo de una variable, parámetro de función o elemento de colección. Esto se denomina tipo existencial.
var drawableItem: Drawable
let items: [Drawable] = [Circle(...), Rectangle(...)]
func process(drawables: [any Drawable]) {
for item in drawables {
item.draw(context: ...)
}
}
La palabra clave any (Swift 5.6+) marca explícitamente un existencial. Sin any, el compilador emite una advertencia. Swift también soporta some (tipos opacos) para ocultar el tipo concreto detrás de un protocolo — este es un enfoque estándar en SwiftUI.
Al trabajar con protocolos, los desarrolladores suelen cometer varios errores recurrentes.
Drawable en lugar de <T: Drawable> donde se necesita un tipo concretoAnyObject innecesariamente, lo que excluye a struct y enumPreguntas frecuentes
Protocol define solo requisitos sin implementación (hasta la llegada de protocol extensions). Una clase abstracta puede contener implementación y estado. Swift no tiene clases abstractas — su papel lo cumplen los protocolos con extensiones.
Sí, las estructuras, clases y enums pueden adoptar protocolos. Esta es la base de POP: no tienes que usar clases para organizar la arquitectura. Las estructuras con protocolos proporcionan semántica de valor e inmutabilidad.
Associated type (associatedtype) es un marcador de posición para un tipo que el tipo implementador determina por sí mismo. Ejemplo: Collection tiene associatedtype Element. Es un genérico a nivel de protocolo.
Sí, añade herencia de AnyObject: protocol MyProtocol: AnyObject. Entonces solo las clases podrán adoptar este protocolo. Es útil para referencias débiles y delegados.
Usa is para comprobar y as? para convertir: if let drawable = item as? Drawable. Esto solo funciona para protocolos sin associated types.
Resumen
&) combina protocolos sin herenciaany) y tipos opacos (some) — dos formas de trabajar con protocolosDesarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.