En Swift, desde el principio se hizo hincapié en los tipos de valor — estructuras (struct) como la herramienta principal para modelar datos. A diferencia de Objective-C, donde todo eran objetos (clases), Swift fomenta el uso de estructuras para modelos simples, datos y pequeños objetos de negocio.
Muchos desarrolladores, especialmente aquellos con experiencia en otros lenguajes orientados a objetos, erróneamente utilizan clases para todo. Esto conduce a problemas de memoria (ciclos de referencia), cambios inesperados al pasar objetos y dificultades con la seguridad de hilos, ya que las clases son tipos de referencia.
Las estructuras en Swift son tipos de valor, se copian al asignarse y al pasarse a funciones, a diferencia de las clases (tipos de referencia) que pasan una referencia. Esta es la razón por la que las estructuras son preferibles para modelos sin lógica compleja de ciclo de vida y herencia.
Ejemplo de código:
struct Point { var x: Int var y: Int } var p1 = Point(x: 10, y: 20) var p2 = p1 p2.x = 30 // p1.x sigue siendo 10
Características clave:
¿Puede una estructura tener un heredero (subclase)?
No, las estructuras en Swift no soportan herencia. Toda la extensión del comportamiento es posible solo a través de protocolos y extensiones.
¿Significa esto que una estructura siempre se copia al ser pasada a una función?
En la práctica, Swift utiliza optimizaciones de Copia-Ala-Escritura. Si no modificamos la estructura, no se copia, y se crea una copia solo al modificarla. Esto se aplica a las colecciones estándar y estructuras complejas.
var arr1 = [1, 2, 3] var arr2 = arr1 arr2.append(4) // Solo aquí ocurre la copia
¿En qué casos no se puede usar una estructura?
Se usaron clases para almacenar datos homogéneos (por ejemplo, para puntos en un mapa), lo que resultó en una pérdida de rendimiento debido al frecuente acceso a la memoria, gestión complicada de la memoria y errores con referencias mezcladas.
Ventajas:
Desventajas:
Uso de estructuras para modelos de datos que se copian de manera segura, no conducen a fugas y no tienen complejidades innecesarias.
Ventajas:
Desventajas: