Métodos Mutantes en Estructuras y Enumerados en Swift

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

Resumen

¿Qué son las funciones mutantes en estructuras y enumerados?

En el mundo de la programación, las estructuras y enumerados son tipos de datos evaluables que, una vez definidos como constantes, no permiten modificar sus valores internos. Sin embargo, en lenguaje Swift, es posible cambiar estos valores a través de métodos llamados funciones mutantes. Este tipo de función utiliza la palabra reservada mutating para indicar que puede modificar los valores de las propiedades de una estructura o enumerado.

¿Cómo funciona una función mutante en una estructura?

Para entender el uso de una función mutante en estructuras, consideremos el siguiente ejemplo donde tenemos una estructura llamada Punto:

struct Punto {
    var x: Int
    var y: Int
    
    mutating func mueve(deltaX: Int, deltaY: Int) {
        x += deltaX
        y += deltaY
    }
}

En este caso, como la función mueve está marcada como mutating, tiene el derecho de modificar los valores de x y y dentro de la estructura Punto. Si nuestro punto es un variable, podemos usar este método para cambiar las coordenadas de manera segura.

¿Por qué es importante la palabra clave mutating?

La palabra reservada mutating es crucial porque:

  • Permite que las funciones cambien los valores de una propiedad dentro de una estructura o enumerado.
  • Resuelve errores de compilación que surgen por intentar modificar propiedades de tipos inmutables.
  • Indica explícitamente un comportamiento que puede sorprender si no se deja claro, es decir, que ciertas acciones pueden cambiar el estado de un objeto.

¿Existen casos especiales para el uso de mutating?

Sí, un caso relevante para usar funciones mutantes es cuando queremos modificar el propio valor de toda la estructura. Imaginemos un método dentro de la misma estructura Punto:

mutating func reposicionar(x: Int, y: Int) {
    self = Punto(x: x, y: y)
}

Aquí, estamos creando un nuevo punto con las coordenadas proporcionadas y reasignándolo a self. Este tipo de función, gracias a la palabra mutating, permite reconfigurar completamente la estructura desde dentro.

¿Cómo actúan las funciones mutantes en los enumerados?

Los enumerados, al igual que las estructuras, pueden beneficiarse de funciones mutantes para alterar sus estados. Supongamos que implementamos un ciclo de estados para un aire acondicionado:

enum EstadoAireAcondicionado {
    case apagado, bajo, alto

    mutating func avanzaEstado() {
        switch self {
        case .apagado:
            self = .bajo
        case .bajo:
            self = .alto
        case .alto:
            self = .apagado
        }
    }
}

En este ejemplo, la función avanzaEstado utiliza mutating para permitir que el estado del aire acondicionado cambie de manera cíclica entre apagado, bajo y alto.

Consideraciones al usar funciones mutantes

Al trabajar con funciones mutantes, es importante considerar lo siguiente:

  • Las funciones mutantes solo pueden ser invocadas en variables de estructuras o enumerados, no en constantes.
  • Este tipo de función es innecesario en clases ya que las clases se manejan por referencia, no por valor.

Las funciones mutantes ofrecen una potente herramienta para modificar los valores interiores de estructuras y enumerados de una manera controlada y explícita, permitiendo mayor flexibilidad en el manejo de datos inmutables.