¿Struct o Class? La eterna pregunta del desarrollador Swift
Cualquiera que empiece a escribir en Swift, tarde o temprano se enfrenta a esta pregunta. A primera vista, ambas construcciones permiten crear objetos con datos y métodos. Pero, ¿por qué en Stack Overflow esta pregunta acumula miles de visitas y los desarrolladores experimentados prefieren cada vez más las estructuras?
La respuesta es simple: porque la elección entre struct y class afecta directamente al rendimiento, la seguridad en la concurrencia y la arquitectura de tu aplicación. En este artículo no solo veremos teoría, sino ejemplos reales y escenarios donde Struct gana indiscutiblemente a Class.
Si programas en Swift y todavía usas clases «por costumbre» de Objective-C, este artículo es para ti. Prepárate para replantearte tus enfoques.
La diferencia principal: Value Type vs Reference Type
Antes de profundizar en los detalles, recordemos la diferencia fundamental:
- Struct es un value type (tipo por valor). Al asignarlo o pasarlo a una función, se crea una copia de los datos.
- Class es un reference type (tipo por referencia). Al asignarlo o pasarlo a una función, se pasa una referencia al mismo objeto en memoria.
Parece un detalle menor. Pero de esta diferencia «atómica» se derivan todas las consecuencias que analizaremos ahora.
Ejemplo 1: Comportamiento inesperado de Class
class PersonClass { var name: String init(name: String) { self.name = name }}
struct PersonStruct { var name: String}
// Probamos la claselet person1 = PersonClass(name: "Ana")let person2 = person1person2.name = "María"
print(person1.name) // ¡María! También cambió en person1print(person2.name) // María¿Notaste el problema? Al cambiar el nombre de person2, sin querer también lo cambiamos en person1. Es el mismo objeto en memoria. En un ejemplo pequeño no es crítico, pero en un proyecto real, esta «modificación colateral» puede provocar errores difíciles de depurar.
// Probamos la estructuravar person3 = PersonStruct(name: "Ana")var person4 = person3person4.name = "María"
print(person3.name) // ¡Ana! Todo en su lugarprint(person4.name) // MaríaLa estructura se comporta de forma predecible: cada variable posee su propia copia independiente de los datos. Esto es seguro y transparente.
¿Cuándo es Struct la elección obvia?
Apple en su documentación recomienda usar struct por defecto. Enumeremos los escenarios concretos donde la estructura gana sin discusión.
1. Datos que deben ser inmutables
Si trabajas con modelos que no deben cambiar después de crearse (por ejemplo, resultados de una consulta al servidor), struct con propiedades constantes es la elección ideal.
struct UserProfile { let id: Int let name: String let email: String}
// Se crea y se olvida. Los datos están protegidos contra cambios accidentales.let profile = UserProfile(id: 1, name: "Iván", email: "ivan@example.com")Con una clase, igual podrías cambiar accidentalmente name si la propiedad se declarara como var. Con una estructura, el compilador te obliga a pensar en la inmutabilidad.
2. Entidades pequeñas y autónomas
Si tu modelo describe algo simple — coordenadas, dimensiones, color, una cantidad de dinero — usa struct. Es lógico y eficiente.
struct Point { var x: Double var y: Double}
struct Money { var amount: Double var currency: String}
struct Rectangle { var origin: Point var size: Size}Estos tipos no necesitan herencia ni gestión de referencias. Simplemente