Struct es un tipo de valor (value type) en el lenguaje Swift, cuyas instancias se copian al transferirse entre partes del código. A diferencia de las clases, las estructuras no soportan herencia, pero implementan protocolos, contienen propiedades y métodos, y proporcionan una gestión de memoria predecible sin ARC. Según la Swift Programming Language Guide, 2026, struct es un bloque de construcción fundamental de Swift — incluso los tipos estándar Int, String, Array y Dictionary están implementados como estructuras. El lenguaje recomienda las estructuras como la opción prioritaria para modelar datos.
Puntos clave
Struct (estructura) es un tipo de dato compuesto en Swift que agrupa propiedades y métodos relacionados en una sola entidad. A diferencia de las clases, las estructuras son value types: al pasarse a una función o asignarse a una nueva variable, se crea una copia independiente de la estructura, no una referencia al objeto original.
Swift utiliza estructuras para todos los tipos primitivos: Int, Double, String, Bool, Array, Dictionary y Set. Esto significa que incluso un número Int básico se comporta como una estructura — al asignarse se crea una copia. El desarrollador puede definir su propia estructura con cualquier conjunto de propiedades y métodos.
Según Swift Evolution (SE-0143), la decisión de implementar los tipos estándar como estructuras se debe al rendimiento y la previsibilidad. Los value types no crean ciclos de referencia, no requieren conteo de referencias ARC y garantizan que la modificación de una copia no afecte al original — esto es críticamente importante para la inmutabilidad de datos en escenarios multihilo.
La semántica de value type es la diferencia clave entre struct y class. Cuando asignas una estructura a una nueva variable o la pasas a una función, Swift crea una copia independiente de todos los datos. Cualquier cambio en la copia no afecta al original, eliminando los efectos secundarios típicos de los tipos de referencia.
// Ejemplo de semántica de value type
struct Point {
var x: Double
var y: Double
}
var p1 = Point(x: 10, y: 20)
var p2 = p1 // p2 es una copia independiente de p1
p2.x = 99 // Solo p2 cambia
print(p1.x) // 10 — p1 sin cambios
print(p2.x) // 99
Swift utiliza Copy-on-Write (COW) para optimizar la copia. Si múltiples variables hacen referencia a la misma estructura pero ninguna modifica los datos, no se produce una copia real. Swift comparte memoria entre las variables hasta la primera mutación — entonces se crea una copia real. Esto evita operaciones de asignación excesivas y acelera el trabajo con colecciones.
Por defecto, los métodos de una estructura no pueden modificar sus propiedades — Swift requiere la palabra clave mutating de forma explícita para los métodos que realizan cambios. Esta restricción protege contra la mutación accidental y hace que el código sea predecible: si un método no está marcado como mutating, tienes la garantía de que no cambiará la estructura.
Cuando añades la palabra clave mutating antes de un método, Swift obtiene la capacidad de escribir nuevos valores en las propiedades de la estructura. De hecho, el método puede incluso reemplazar completamente la instancia de la estructura por una nueva mediante self =. Este mecanismo se utiliza, por ejemplo, en los tipos Option y Result.
// Struct con método mutating
struct Counter {
private var value: Int = 0
// Método mutating — puede modificar propiedades
mutating func increment() {
value += 1
}
// El método mutating puede reemplazar self por completo
mutating func reset() {
self = Counter()
}
// Método no mutating — solo lectura
func currentValue() -> Int {
return value
}
}
var counter = Counter()
counter.increment()
print(counter.currentValue()) // 1
counter.reset()
print(counter.currentValue()) // 0
Reglas para mutating: la estructura debe declararse con var, no con let — una estructura constante no puede llamar a un método mutating. El compilador lo verifica en tiempo de compilación: intentar llamar a un método mutating en una constante let generará un error de compilación.
La elección entre struct y class es una de las decisiones fundamentales en Swift. Ambos tipos pueden contener propiedades, métodos, inicializadores e implementar protocolos, pero tienen diferencias fundamentales en la semántica de memoria, la herencia y la gestión del ciclo de vida.
| Característica | struct | class |
|---|---|---|
| Tipo | Value type (se copia) | Reference type (referencia) |
| Herencia | No soporta | Soporta |
| ARC / conteo de referencias | No requerido | ARC requerido |
| Desinicialización | No soporta | Soporta deinit |
| Modificación de propiedades en constantes | Solo mediante var | Posible mediante let (la referencia es constante) |
| Type casting | No soporta | Soporta |
| Almacenamiento en colecciones | Se almacena directamente (valor) | Se almacena como referencia (puntero) |
Las estructuras son preferibles cuando los datos no requieren herencia, no deben tener identidad compartida (por ejemplo, coordenadas, tamaños, configuración) y se transfieren entre módulos. Las clases se eligen para componentes de UI (UIView, UIViewController), singletons y objetos con identidad compartida.
Apple recomienda usar struct como tipo por defecto para modelar datos en Swift. Las estructuras son adecuadas para la mayoría de los escenarios gracias a la semántica de copia predecible y la ausencia de sobrecarga por conteo de referencias. Veamos los casos típicos en los que struct es la opción óptima.
Si una entidad contiene datos sin necesidad de herencia (Product, User, Order, Point), usa struct. El compilador genera automáticamente un memberwise initializer — no necesitas escribir init manualmente. Equatable y Hashable también se implementan automáticamente para estructuras cuyas propiedades cumplen con estos protocolos.
Para configuraciones, ajustes y banderas que no cambian después de la creación, struct es preferible a class. Una estructura constante (let) garantiza la inmutabilidad de todos los campos anidados — en una class esto solo se aplica a la referencia, no al contenido del objeto.
Las estructuras son seguras en entornos multihilo gracias a la semántica de valor. Cada hilo obtiene una copia independiente de los datos y no afecta a otros hilos. Las condiciones de carrera entre hilos son imposibles para los value types, lo que convierte a struct en la opción preferida para modelos en SwiftUI (ObservableObject requiere class, pero @State usa struct).
// Ejemplo de uso de struct para modelo de datos
struct User: Codable, Identifiable {
let id: UUID
var name: String
var email: String
var isPremium: Bool
// Propiedad computada — no mutating
var displayName: String {
isPremium ? "\(name) ⭐️" : name
}
}
// Inicializador memberwise automático
let user = User(
id: UUID(),
name: "Alice",
email: "alice@example.com",
isPremium: true
)
// La copia es segura para entornos multihilo
var userCopy = user
userCopy.isPremium = false
// user.isPremium sigue siendo true
Usa class cuando necesites herencia (componentes UIKit/AppKit), identidad compartida (delegate, observer) o ciclo de vida controlado del objeto (deinit). Para todo lo demás — usa struct.
Preguntas frecuentes
Struct en Swift es un tipo de valor (value type) que se copia al transferirse entre partes del código. Las estructuras pueden contener propiedades, métodos, inicializadores e implementar protocolos. Los tipos básicos de Swift (Int, String, Array) están implementados como estructuras.
Struct es un value type (se copia al asignarse), no soporta herencia y no requiere ARC. Class es un reference type (se pasa por referencia), soporta herencia, desinicialización y conteo de referencias. Los desarrolladores recomiendan struct como tipo por defecto.
Mutating es una palabra clave que indica que un método de la estructura puede modificar sus propiedades. Sin mutating, el compilador prohíbe la modificación de campos. Los métodos mutating solo pueden llamarse en variables declaradas con var, no con let.
Copy-on-Write (COW) es una optimización de Swift para estructuras en la que la copia real de datos se aplaza hasta la primera mutación. Mientras todas las variables solo leen la estructura, comparten una única área de memoria. Esto mejora el rendimiento al trabajar con colecciones grandes.
Usa struct para modelos de datos sin herencia, configuraciones, DTOs y escenarios multihilo. Usa class para componentes de UI UIKit/AppKit, singletons, entidades con identidad compartida (delegate, observer) y objetos que requieran desinicialización.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también