Swift Academy · Lección

Mutación, compartición y aliasing inesperado

Aprenda cómo las referencias compartidas provocan errores y cómo los tipos valor los previenen.

Lección 2 de 412 pasos

Mutación, compartición y aliasing inesperado es una lección gratuita de Swift Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Swift Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Swift Academy incluye 4 lecciones en total.

Bienvenida

El aliasing ocurre cuando dos variables hacen referencia al mismo objeto. Con los tipos de valor es imposible; con los tipos de referencia provoca errores inesperados. Comprender esta diferencia es fundamental.

Los tipos de valor no tienen aliasing

```swift var a = [1,2,3] var b = a // independent copy a.append(4) print(b) // [1,2,3] — unchanged ``` Cada asignación de un tipo de valor crea una copia independiente.

Los tipos de referencia SÍ tienen aliasing

```swift class Counter { var value = 0 } let a = Counter() let b = a // SAME object a.value += 1 print(b.value) // 1 — b sees the change! ``` Tanto `a` como `b` apuntan al mismo objeto del montón.

Aliasing en parámetros de función

```swift func increment(_ c: Counter) { c.value += 1 } let shared = Counter() increment(shared) print(shared.value) // 1 — mutated by the function ``` Las clases se pasan por referencia; la función modifica el original.

El problema: estado mutable compartido

```swift class Cache { var items: [String] = [] } var cache = Cache() var cache2 = cache // aliased! cache.items.append("data") print(cache2.items) // ["data"] — unexpected! ``` Así es como partes del código aparentemente independientes se afectan entre sí.

Solución mediante tipos de valor

```swift struct Cache { var items: [String] = [] } var cache = Cache() var cache2 = cache // independent copy cache.items.append("data") print(cache2.items) // [] — unaffected ```

Solución mediante clases que realizan copias

```swift func process(_ c: Counter) { var local = Counter() local.value = c.value // copy values, not reference local.value += 1 } ``` Cuando necesite semántica de referencia, pero no aliasing, copie los valores explícitamente.

Seguridad de subprocesos y aliasing

El aliasing se vuelve especialmente peligroso entre hilos: ```swift // Thread 1: cache.items.append("a") // Thread 2 simultaneously: cache.items.append("b") // ❌ data race! ``` Los tipos valor de Swift Concurrency lo evitan de forma predeterminada: solo los actores pueden compartir estado mutable.

Detección de aliasing accidental

El Thread Sanitizer (TSan) de Xcode detecta condiciones de carrera de datos durante la ejecución. Actívelo en Scheme > Diagnostics > Thread Sanitizer. Swift Exclusivity Enforcement detecta durante la ejecución las infracciones de aliasing en un solo hilo para los parámetros `inout`.

Patrones de aliasing intencional

A veces el aliasing es intencional, por ejemplo, una caché global: ```swift class AppCache { static let shared = AppCache() // intentional shared reference var data: [String: Any] = [:] } ``` Documente claramente los casos de uso compartido intencional; evite el aliasing accidental usando tipos valor de forma predeterminada.

Comprobación rápida

¿Qué sucede cuando asigna una instancia de una clase a una variable nueva?

Resumen

Conclusiones clave: • Tipos valor (struct): la asignación copia el valor; no es posible el aliasing • Tipos referencia (class): la asignación comparte la referencia; es posible el aliasing • El aliasing entre hilos = condición de carrera de datos • Use structs de forma predeterminada; use clases solo cuando necesite una identidad compartida • Use TSan y Swift Exclusivity para detectar problemas Siguiente: grafos mixtos de valores y referencias.
Gratis para empezar

Aprende Swift con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
122
Lecciones
409

Preguntas frecuentes

¿La lección «Mutación, compartición y aliasing inesperado» es gratis?

Sí — el texto completo de «Mutación, compartición y aliasing inesperado» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Swift Academy, actualiza a CoddyKit PRO. El curso de Swift Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Mutación, compartición y aliasing inesperado»?

Aprenda cómo las referencias compartidas provocan errores y cómo los tipos valor los previenen. Practicas Swift Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Swift Academy?

No se requiere experiencia previa. Swift Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Mutación, compartición y aliasing inesperado»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Swift Academy?

Sí. Cada lección de Swift Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Stack frente a heap: dónde viven los valores
  2. Mutación, compartición y aliasing inesperado
  3. Grafos mixtos de valores y referencias
  4. Diseño de APIs con semántica de valor
← Volver a Swift Academy