struct — qué es, conceptos clave y sintaxis en Swift

Autor: IT Sectr Publicado: 2026-06-17 Tiempo de lectura: 7 min

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 es un tipo de valor en Swift que se copia al asignarse y se pasa por valor, no por referencia.
  • Copy-on-Write es una optimización en la que la copia real de datos ocurre solo al modificar el valor, no al asignarlo.
  • Mutating es la palabra clave requerida para los métodos que modifican las propiedades de una estructura.
  • Protocolos — las estructuras pueden implementar protocolos y extensiones, lo que proporciona flexibilidad sin herencia.
  • Seguridad — la ausencia de ciclos de referencia hace que las estructuras sean preferibles para código multihilo y modelos de datos.

¿Qué es struct en Swift?

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.

Struct como value type

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.

swift
// 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

Optimización Copy-on-Write

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.

Mutabilidad y métodos mutating

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.

Mutating en acción

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.

swift
// 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.

Struct vs Class: comparació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ísticastructclass
TipoValue type (se copia)Reference type (referencia)
HerenciaNo soportaSoporta
ARC / conteo de referenciasNo requeridoARC requerido
DesinicializaciónNo soportaSoporta deinit
Modificación de propiedades en constantesSolo mediante varPosible mediante let (la referencia es constante)
Type castingNo soportaSoporta
Almacenamiento en coleccionesSe 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.

Cuándo elegir struct

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.

Modelos de datos sin herencia

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.

Datos inmutables

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.

Código multihilo

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

swift
// 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

¿Qué es struct en Swift?

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.

¿Cuál es la diferencia entre struct y class en Swift?

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.

¿Qué es mutating en struct Swift?

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.

¿Qué es Copy-on-Write en Swift?

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.

¿Cuándo usar struct y cuándo usar class en Swift?

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

  • Struct es un tipo de valor en Swift que se copia al asignarse, proporcionando un comportamiento predecible sin efectos secundarios entre copias.
  • Copy-on-Write optimiza el rendimiento de las estructuras — la copia real ocurre solo en la primera mutación, no en cada asignación.
  • Los tipos estándar de Swift — Int, String, Array, Dictionary — están implementados como estructuras, lo que garantiza semántica de valor para todas las operaciones básicas.
  • Mutating es una palabra clave obligatoria para los métodos que modifican propiedades de la estructura; solo se puede llamar en instancias var.
  • Las estructuras no soportan herencia pero implementan protocolos y pueden usar extensiones para añadir funcionalidad.
  • Equatable y Hashable se implementan automáticamente para estructuras cuyas propiedades cumplen con estos protocolos — simplificando la comparación y el uso en colecciones.
  • Apple recomienda struct como tipo por defecto — usa class solo cuando se requiera herencia, identidad compartida o ciclo de vida controlado del objeto.

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.

Discutir el proyecto

Lea también