Por qué las clases Swift no copian valores

Clase 4 de 27Curso de Programación Orientada a Objetos en Swift

Resumen

Comprender cómo funcionan las clases en Swift te evita errores costosos: las clases son tipos por referencia, no de valor. Copiar una variable que guarda un objeto no duplica la instancia: ambas variables señalan la misma posición de memoria. Si cambias una, cambias la otra. Esto explica comportamientos inesperados cuando crees que trabajas con “copias” independientes.

¿Qué significa tipo por referencia en Swift?

En un tipo por referencia, una variable o constante almacena una referencia a la instancia, no el contenido. Al asignar esa referencia a otra variable, no creas otro objeto; solo obtienes dos nombres para el mismo objeto.

  • Copiar una referencia no crea una nueva instancia.
  • Modificar propiedades desde cualquiera de las referencias se refleja en ambas.
  • Es el clásico error de principiante: pensar que una “copia” es independiente y pisar datos sin querer.

Además, con una constante que guarda un objeto, la referencia no cambia, pero sus propiedades mutables sí pueden modificarse. La instancia sigue en la misma dirección de memoria, pero su estado interno se actualiza.

¿Cómo se ve con VideoMode 1080i y framerate?

El ejemplo usa una clase VideoMode con propiedades como resolution, interlaced, name y framerate. Se configura un modo de vídeo 1920×1080 (HD), entrelazado y con nombre “1080i”. Luego se crea otra referencia a la misma instancia y se cambia el framerate a 30: ambas referencias muestran el cambio.

let tenEighty = VideoMode()
tenEighty.resolution = hd            // 1920 x 1080
teenEighty?.interlaced = true        // si ya existía la propiedad como opcional
// En el relato no se indica opcionalidad; si no lo es:
// tenEighty.interlaced = true

tenEighty.name = "1080i"
tenEighty.framerate = 25

// “Copiar” no crea una nueva instancia: comparte referencia
let alsoTenEighty = tenEighty

// Cambiamos la “copia”
alsoTenEighty.framerate = 30

// Aquí, ambas referencias observan framerate = 30

Claves prácticas que se muestran con el ejemplo:

  • “Copias” como alsoTenEighty no duplican el objeto: comparten estado.
  • Cambiar framerate en la “copia” actualiza el original.
  • Aunque la referencia se haya creado con let, sus propiedades variables pueden cambiar.

¿Cómo se comparan instancias y qué pasa con constantes?

Comparar objetos por valor con == no aplica si la clase no define esa igualdad. Para clases, lo que sí está disponible es la identidad: usar === para saber si dos referencias apuntan a la misma instancia, y !== para comprobar que no lo hacen.

if tenEighty === alsoTenEighty {
    print("son el mismo objeto")
} else {
    print("son diferentes")
}

// Para la no igualdad de identidad:
// if tenEighty !== alsoTenEighty { ... }

Sobre constantes y mutabilidad:

  • Con let tenEighty = VideoMode(), la referencia es constante: no puede reasignarse a otra instancia.
  • Las propiedades dentro del objeto pueden cambiar si están declaradas como variables.

Contexto conceptual útil:

  • En lenguajes como C, C++ u Objective-C se hablaba de punteros y se usaba un asterisco para indicar direcciones de memoria.
  • En Swift la sintaxis es más ligera: manejas referencias sin asteriscos ni punteros explícitos, pero el comportamiento de referencia compartida sigue presente.

¿Te ha pasado que “una copia” cambie datos en otro sitio del código? Cuéntalo y pregunta tus dudas: ¿dónde te gustaría aplicar === o replantear el uso de clases frente a estructuras?

      Por qué las clases Swift no copian valores