Al desarrollar para iOS, hay un punto que suele generar dudas.
La diferencia entre Objective-C Category y Swift extension.
Ambos permiten «añadir funciones a una clase existente», así que es fácil verlos como lo mismo.
En resumen, se parecen por fuera, pero difieren bastante en el tipo de destino y en su funcionamiento.
Category solo se aplica a clases y funciona en tiempo de ejecución; extension también admite estructuras, enumeraciones y protocolos, y se resuelve en compilación.
Hoy los compararé uno por uno desde una perspectiva práctica.
¿Qué es una Category de Objective-C?
Una Category permite añadir métodos sin heredar de la clase existente.
Incluso puedes añadir tus métodos a una clase de framework como NSString.
No necesitas el código fuente.
// NSString añade un método de validación de correo electrónico
@interface NSString (Validation)
- (BOOL)isValidEmail;
@end
La clave es que el método se incorpora a la clase en tiempo de ejecución.
Es flexible, pero si dos Category definen el mismo método, no se garantiza cuál prevalecerá.
Cuando hay nombres duplicados entre Category, es fácil acabar con errores difíciles de rastrear.
¿En qué se diferencia Swift extension?
Puedes considerar Swift extension como una versión ampliada de Category.
Permite añadir métodos, propiedades calculadas, inicializadores, tipos anidados y conformidad con protocolos.
Y, sobre todo, no se limita a las clases.
También se aplica a estructuras (struct), enumeraciones (enum) y protocolos.
// String añade una propiedad calculada
extension String {
var isValidEmail: Bool {
contains("@") && contains(".")
}
}
La posibilidad de ofrecer implementaciones predeterminadas mediante protocol extension es una potente ventaja que no existe en las Category de Objective-C.
Reduce mucho el código duplicado.
Category vs. extension: diferencias clave de un vistazo
Para evitar confusiones, lo resumí en una tabla (sintaxis de 2026).
| Criterio | Objective-C Category | Swift extension |
|---|---|---|
| Destino | Solo clases | Clases, estructuras, enumeraciones y protocolos |
| Propiedad calculada | No directamente | Sí |
| Propiedad almacenada | No | No |
| Implementación predeterminada de protocolo | No | Sí |
| Colisión de nombres de métodos | Riesgo en tiempo de ejecución | Se evita en compilación |
| Momento de ejecución | Tiempo de ejecución | Tiempo de compilación |
También comparten una característica.
Ninguno permite añadir propiedades almacenadas (stored property).
Si necesitas añadir estado, debes usar associated object de Objective-C, aunque no es una opción especialmente recomendable.
¿Cuál conviene usar en la práctica?
Estos son los criterios que he extraído de mi experiencia en proyectos.
- En un proyecto escrito solo en Swift, uso extension sin dudarlo.
- Si mantengo código Objective-C antiguo, sigo usando Category.
- Para distribuir una función común entre varios tipos, protocol extension suele ser la mejor opción.
También es frecuente combinarlos.
Puedes usar directamente desde Swift una función creada con una Category de Objective-C.
Recuerda que Swift extension no será visible desde Objective-C si no añades @objc.
Si pasas por alto este detalle, es fácil obtener errores de compilación durante el bridging.
En resumen, Category es una extensión de clases en tiempo de ejecución; extension abarca casi todos los tipos y se resuelve en compilación.
Con esta diferencia clara, la estructura del código será mucho más limpia.
¡Espero que sigas disfrutando del desarrollo!

