JG

iOS

Struct vs Class en Swift: ¿Cuál deberías usar y cuándo?

20 de junio de 2025
SwiftiOSStructClassDesarrollo Móvil
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:

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

¿Cuándo usar Class?

Las clases son útiles en escenarios más complejos donde necesitas:

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

Heap vs Stack Memory
Heap vs Stack Memory

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.