Protocol en Swift — qué es, sintaxis y capacidades

Autor: IT Sectr Publicado: 2026-06-17 Tiempo de lectura: 6 min

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 — un contrato con requisitos para estructuras, clases y enums
  • Requirements incluyen métodos, propiedades, inicializadores y subíndices
  • Protocol Composition permite combinar múltiples protocolos
  • POP — Programación Orientada a Protocolos, alternativa a la herencia
  • Protocol Extensions añaden implementaciones predeterminadas para métodos

¿Qué es un Protocol en Swift?

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:

  • Métodos de instancia y de tipo (estáticos)
  • Propiedades con especificadores { get } o { get set }
  • Inicializadores
  • Subíndices
  • Associated types (genéricos a nivel de protocolo)

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.

Sintaxis de declaración de protocolos

Protocol se declara con la palabra clave protocol, un nombre y un cuerpo.

swift
protocol Drawable {
    func draw(context: CGContext)
    var boundingBox: CGRect { get }
}

Un tipo adopta un protocolo mediante dos puntos después de su nombre:

swift
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.

Requisitos de propiedades y métodos

Property requirements se declaran con la palabra clave var y los especificadores de acceso { get } o { get set }.

swift
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.

Herencia de protocolos

Protocol puede heredar de otro protocolo, añadiendo nuevos requisitos. Esto crea una jerarquía de contratos sin acoplamiento rígido a clases.

swift
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

Protocol Composition es un mecanismo que permite especificar que un tipo debe cumplir con varios protocolos simultáneamente, sin crear un nuevo protocolo combinado.

swift
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 como tipo

Protocol puede usarse como tipo de una variable, parámetro de función o elemento de colección. Esto se denomina tipo existencial.

swift
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.

Errores comunes con protocolos

Al trabajar con protocolos, los desarrolladores suelen cometer varios errores recurrentes.

  • Mutating olvidado — un método está marcado como mutating en el protocolo, pero una estructura lo implementa sin la palabra clave
  • Protocol como tipo en lugar de genérico — usar Drawable en lugar de <T: Drawable> donde se necesita un tipo concreto
  • Referencia circular de protocolo — un protocolo que se referencia a sí mismo a través de un associated type sin resolución adecuada
  • Protocolo solo para clases — usar AnyObject innecesariamente, lo que excluye a struct y enum

Preguntas frecuentes

¿En qué se diferencia un protocol de una clase abstracta?

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.

¿Puede una struct adoptar un protocol?

, 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.

¿Qué es un associated type en un protocolo?

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.

¿Puedo restringir un protocolo solo para clases?

, 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.

¿Cómo verificar la conformidad con un protocolo en tiempo de ejecución?

Usa is para comprobar y as? para convertir: if let drawable = item as? Drawable. Esto solo funciona para protocolos sin associated types.

Resumen

  • Protocol — un contrato para métodos, propiedades, inicializadores y subíndices
  • Class, struct, enum — todos los tipos pueden adoptar protocolos
  • Herencia de protocolos crea una jerarquía de contratos sin acoplamiento rígido
  • Protocol Composition (&) combina protocolos sin herencia
  • Tipos existenciales (any) y tipos opacos (some) — dos formas de trabajar con protocolos
  • POP es recomendado por Apple como alternativa a la herencia clásica de clases
  • Protocol Extensions permiten añadir implementaciones predeterminadas

Desarrollaremos 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.

Discutir el proyecto

Lea también