Inicializadores y copias por valor en Swift

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

Resumen

Aprende a distinguir con claridad cómo se crean y copian los datos en Swift. Verás cómo usar los inicializadores por defecto en estructuras, configurar propiedades como width y height, y entender por qué estructuras y enumerados son tipos por valor: al copiar, cada instancia conserva su propio estado.

¿Cómo funcionan los inicializadores por defecto en Swift?

Los inicializadores por defecto de una estructura permiten definir los valores de sus propiedades al crear el objeto. Si la instancia se crea como constante con let, no podrás modificar sus propiedades después. Por eso, debes establecer los valores en el momento de la creación.

¿Cómo definir resoluciones VGA y HD?

En el ejemplo, se modela una resolución con propiedades width y height. Al crear VGA y HD, se pasan los valores en el inicializador.

struct Resolution { var width: Int var height: Int } let vga = Resolution(width: 640, height: 480) let hd = Resolution(width: 1920, height: 1080) print(vga.width) // 640 print(vga.height) // 480
  • Estructura + let: la instancia es inmutable tras crearse.
  • Inicializador por defecto: acepta cada variable interna como parámetro.

¿let o var al crear una estructura?

  • let para instancias que no cambiarán sus propiedades.
  • var si planeas modificar propiedades más tarde.
  • Si necesitas fijar valores iniciales y luego cambiar, usa var para la instancia.

¿Qué implica que estructuras y enumerados sean tipos por valor?

Cuando asignas una estructura a otra variable, se copia el valor. Cada copia es independiente: cambiar una no afecta a la otra. Lo mismo ocurre con los enumerados.

¿Qué pasa al copiar y modificar una estructura?

A partir de una constante hd, se crea una variable cinema y se modifica solo su width. hd permanece intacta.

let hd = Resolution(width: 1920, height: 1080) var cinema = hd // copia por valor print(cinema.width, cinema.height) // 1920 1080 cinema.width = 2048 // modificamos la copia print(cinema.width, cinema.height) // 2048 1080 print(hd.width, hd.height) // 1920 1080 (no cambia)
  • Copia por valor: cada instancia guarda sus propios datos.
  • Independencia: modificar cinema no altera hd.

¿Cómo se comporta un enumerado como CompassPoint?

Los enumerados también son tipos por valor. Copiar un valor y modificar el original no cambia la copia.

enum CompassPoint { case north, south, east, west } var currentDirection: CompassPoint = .north let oldDirection = currentDirection // copia por valor currentDirection = .south print(currentDirection) // south print(oldDirection) // north

Incluso si oldDirection fuera variable, seguiría conservando el valor copiado en el momento de la asignación.

var oldDirection2 = currentDirection // copia actual (south) currentDirection = .west print(currentDirection) // west print(oldDirection2) // south
  • Enumerados: se asignan y se copian por valor.
  • No hay referencias compartidas: cada variable mantiene su propio estado.

¿Qué palabras clave y conceptos debes recordar?

Comprender estos términos te ayudará a escribir código más claro y predecible.

  • Inicializador por defecto: crea instancias pasando valores para cada propiedad variable de la estructura.
  • Estructura (struct): tipo por valor. Las copias son independientes.
  • Constante (let) vs variable (var): con let, la instancia no permite cambios en sus propiedades. Con var, sí.
  • Propiedades width y height: ejemplo práctico para fijar valores iniciales como 640×480 (VGA) o 1920×1080 (HD).
  • Enumerado (enum): tipo por valor, como CompassPoint con north, south, east, west.
  • Copia por valor: al asignar, se duplican los datos, no la referencia.
  • Clases: se mencionan como diferentes en su comportamiento, tema a tratar aparte.

¿Te quedó alguna duda sobre inicializadores o copias por valor? Cuéntame en los comentarios qué caso te gustaría ver con más detalle.