Simplificando la conformidad con protocolos mediante enum en Swift
Arturo Rivas Arias
Swift sigue evolucionando con pequeñas mejoras que, aunque pueden pasar desapercibidas, ayudan a escribir un código más limpio y expresivo. Una de ellas permite utilizar una propiedad constante inicializada con un caso de un enum para satisfacer directamente los requisitos de un protocolo, eliminando código repetitivo cuando un protocolo requiere un valor estático fijo.
Hasta ahora era habitual implementar una propiedad estática calculada que simplemente devolvía un caso concreto de una enumeración.
enum Priority {
case low
case medium
case high
}
protocol Prioritizable {
static var priority: Priority { get }
}
struct BackupTask: Prioritizable {
static var priority: Priority {
.high
}
}
Aunque esta implementación funciona perfectamente, en realidad no contiene ninguna lógica: únicamente devuelve siempre el mismo valor.
Las versiones más recientes de Swift permiten expresar exactamente la misma idea utilizando una constante estática.
struct BackupTask: Prioritizable {
static let priority = .high
}
El compilador reconoce que esa constante satisface el requisito del protocolo, eliminando código ceremonial (boilerplate) y haciendo que la conformidad resulte mucho más evidente.
Este patrón resulta especialmente útil cuando diseñamos APIs en las que cada tipo representa un comportamiento concreto.
Por ejemplo, imaginemos un sistema de registro de eventos:
enum LogCategory {
case network
case database
case analytics
}
protocol LoggableFeature {
static var category: LogCategory { get }
}
struct LoginService: LoggableFeature {
static let category = .network
}
struct UserStatistics: LoggableFeature {
static let category = .analytics
}
Cada tipo deja clara su categoría sin necesidad de implementar una propiedad calculada que únicamente devuelve un valor fijo.
Otro ejemplo podría ser un sistema de pantallas dentro de una aplicación:
enum ScreenStyle {
case onboarding
case authenticated
case settings
}
protocol AppScreen {
static var style: ScreenStyle { get }
}
struct WelcomeView: AppScreen {
static let style = .onboarding
}
struct ProfileView: AppScreen {
static let style = .authenticated
}
Este enfoque aporta varias ventajas:
- Reduce el código repetitivo.
- Hace que las conformidades con protocolos sean más fáciles de leer.
- Refuerza la idea de que ese valor forma parte de la identidad del tipo.
- Facilita el mantenimiento de APIs con numerosos tipos conformes.
No se trata de una característica revolucionaria, pero refleja muy bien la dirección que está tomando Swift. El lenguaje continúa eliminando pequeñas cantidades de boilerplate para que la intención del desarrollador quede reflejada de la forma más directa posible.
Son precisamente este tipo de refinamientos los que hacen que las APIs escritas en Swift resulten cada vez más expresivas, legibles y fáciles de mantener.