Por qué las clases Swift no copian valores
Clase 4 de 27 • Curso de Programación Orientada a Objetos en Swift
Contenido del curso
Tipos de Propiedades
- 5

Propiedades Almacenadas en Swift: Uso y Ejemplos Prácticos
04:48 min - 6

Propiedades Lazy en Programación: Uso y Ventajas
07:16 min - 7

Propiedades Computadas en Swift: Uso y Ejemplos Prácticos
10:30 min - 8

Computed properties de solo lectura en Swift
05:14 min - 9

Observers en Swift: willSet y didSet
07:18 min - 10

Variables estáticas en clases, estructuras y enumerados
09:19 min
Métodos, subíndices y herencia
- 11

Métodos de instancia en Swift con self
07:35 min - 12

Métodos Mutantes en Estructuras y Enumerados en Swift
09:05 min - 13

Métodos de clase en Swift: static vs class
10:50 min - 14

Subíndices en Swift: Sintaxis y Aplicaciones Prácticas
09:01 min - 15

Manipulación de Matrices y Subíndices en Programación
12:27 min - 16

Herencia de Clases en Programación Orientada a Objetos
10:14 min - 17

Sobrescritura de Métodos y Propiedades en Clases Derivadas
12:11 min
Inicializadores o constructores
- 18

Inicializadores en Sweet: Creación y Uso Efectivo de Constructores
06:50 min - 19

Modificación de Constructores y Parámetros Opcionales en Swift
10:10 min - 20

Constructores Designados y de Conveniencia en Herencia de Clases
09:37 min - 21

Constructores y manejo de inicialización opcional en Swift
08:42 min - 22

Destructores en Programación: Liberación de Recursos Automática
07:12 min
Encadenamiento opcional
Conclusión
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?