¿Qué es una property observer?

El nombre es bastante autoexplicativo, pero es básicamente una propiedad que podemos colocarle a nuestras variables de forma que queden observadas y realizar alguna acción cuando las mismas sufran algún cambio.

Las property observer son didSet{ } y willSet{ }. Las mismas pueden usarse en conjunto, sin embargo también podemos hacer uso de solo una de ellas según lo que necesitemos.

var userName: String = "Silvia" {
    
    willSet {
       // Haz esto antes de que el nuevo valor se setee
    }
    didSet {
        // Haz esto después de que el nuevo valor se setee
    }
}

willSet { }

willSet { } albergará las acciones que queremos que ocurran antes de que el valor de observado se modifique. Estas acciones pueden ser de cualquier tipo, por ejemplo una animación de carga mientras se actualizan los valores en un llamado a API, el llamado a un método o el trackeo de una acción de nuestra app.

Cuando utilizamos willSet { } podremos utilizar una propiedad propia que será newValue esta, aunque no la hayamos declarado nosotros en nuestro código existe dentro del willSet { } y podremos utilizarla en caso de necesitarlo.

var userName: String = "Silvia" {
    
    willSet {
       if newValue != userName  {
            print("Your old userName was \\(userName) and it will be changed to \\(newValue)")
        }
    }
}
userName = "Camus"
print(userName) // "Your old userName was Silvia and it will be changed to Camus"

didSet { }

didSet { } por su parte, albergará las acciones que queremos que ocurran después de que el valor de observado se modifique. De igual forma las acciones a realizar pueden ser las que nosotros deseemos.

En este caso también podremos hacer uso de una propiedad propia pero en este caso, como el valor ya se ha modificado el newValue del willSet se ha convertido realmente en userName pero el propertyObserver nos dejará utilizar el anterior con oldValue

var userName: String = "Silvia" {
    
    didSet {
        ("Bye bye \\(oldValue), welcome \\(userName)")
    }
}

userName = "Camus"
print(userName) // "Bye bye Silvia, welcome Camus"

Caso de uso: Wordle

En el Wordle decidimos sumar una personalización en la que el usuario puede escoger si quiere ver el juego en modo oscuro, claro o en el modo en que tenga configurado su dispositivo. para ello se creó la clase ColorSchemeManager

Aquí ocurren un par de cosas: