Struct vs Class en Swift: ¿Cuál deberías usar y cuándo?
En Swift, una de las decisiones más comunes —y a la vez más fundamentales— que todo desarrollador debe tomar es: ¿Uso una struct o una class?. A primera vista pueden parecer similares, pero sus diferencias marcan una gran diferencia en diseño, rendimiento y mantenimiento del código.
Desde el principio, Apple ha recomendado usar struct
por defecto, pero ¿por qué? ¿Cuándo deberías optar por una class
? En este artículo vamos a desglosar estas preguntas y ayudarte a tomar la mejor decisión para tu proyecto.
¿Qué es una Struct y qué es una Class?
Ambas son formas de crear tipos personalizados en Swift, pero tienen diferencias clave:
-
Structs son tipos por valor.
-
Classes son tipos por referencia.
¿Qué significa esto? Vamos con un ejemplo.
// Struct
struct Usuario {
var nombre: String
}
var user1 = Usuario(nombre: "Carlos")
var user2 = user1
user2.nombre = "Ana"
print(user1.nombre) // Carlos
print(user2.nombre) // Ana
En este caso, user1
y user2
son copias independientes. Cambiar uno no afecta al otro. Significa que cada vez que asignas una struct a otra variable, estás creando una copia nueva en memoria.
Este es el comportamiento esperado de los tipos por valor y a la vez es lo más intuitivo para la mayoría de los desarrolladores (aunque no lo creas, los programadores también somos seres humanos, salvo algunas excepciones como Linus Torvalds y Bjarne Stroustrup, ellos son dioses del Olimpo).
// Class
class Persona {
var nombre: String
init(nombre: String) {
self.nombre = nombre
}
}
var persona1 = Persona(nombre: "Carlos")
var persona2 = persona1
persona2.nombre = "Ana"
print(persona1.nombre) // Ana
print(persona2.nombre) // Ana
En cambio, en este ejemplo ambos apuntan a la misma instancia en memoria. Cambiar persona2
también afecta a persona1
. Esto es porque las clases son tipos por referencia, lo que significa que cuando asignas una clase a otra variable, ambas variables apuntan al mismo objeto en memoria.
Podemos decir que una class solo crea un espacio en memoria cuando se crea una instancia de la misma, es decir cuando se hace let persona = Persona(nombre: "Carlos")
.
Esto tiene sus ventajas y desventajas. Por un lado, las clases permiten compartir el mismo objeto entre diferentes partes del código, lo que puede ser útil en ciertos casos. Por otro lado, esto puede llevar a efectos colaterales inesperados si no se maneja con cuidado.
¿Cuándo usar Struct?
Apple recomienda usar struct
por defecto, y solo usar class
si realmente necesitas las características adicionales que esta provee.
-
Tu tipo representa un valor simple: como coordenadas, colores, tamaños o configuraciones.
-
No necesitas herencia.
-
Quieres asegurar que cada instancia sea inmutable o independiente.
-
Buscas mejor rendimiento al copiar valores en lugar de referencias.
¿Cuándo usar Class?
Las clases son útiles en escenarios más complejos donde necesitas:
-
Herencia: compartir o extender funcionalidad entre tipos relacionados.
-
Referencias compartidas: múltiples variables apuntando al mismo objeto mutable.
-
Desinicialización (deinit): para liberar recursos cuando el objeto se destruye.
¿Y qué pasa con el rendimiento?
En general, las structs son más ligeras y rápidas porque el sistema puede optimizar el uso de memoria al tratar valores. Las clases, al requerir referencia y manejo del heap, pueden ser más costosas.
Esto me da pie para explicar un poco lo que es el heap/stack de memeria. Pero es un tema que merece un artículo por sí solo. En resumen, el heap es una región de memoria donde se almacenan objetos que pueden ser referenciados por múltiples variables. Las structs, al ser tipos por valor, se almacenan en la pila (stack), lo que las hace más eficientes en términos de acceso y uso de memoria.

Eso sí, si tienes una estructura muy grande o necesitas que sea mutable desde varias partes del código, ahí es donde una class puede tener más sentido.
Conclusión
No se trata de que una sea mejor que la otra. Se trata de elegir la herramienta correcta para el contexto adecuado. Si estás modelando datos que representan un valor y quieres evitar efectos colaterales, las struct
son ideales. Si necesitas un sistema complejo con comportamiento compartido o mutabilidad controlada, entonces ve con class
.
Si no tienes claro qué usar, empieza usando struct
. Es más seguro, más predecible y te ayudará a evitar muchos problemas comunes en el desarrollo de software. Si necesitas una clase más adelante siempre puedes refactorizar tu código para usar una class
en lugar de una struct
. Pero en la mayoría de los casos, una struct
será suficiente y te dará un código más limpio y eficiente.