Struct vs Class en Swift: cuándo y por qué elegir una estructura

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿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ía


La 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

Blogs

Book Recommendations