¿Cómo sobrescribo el setter de la propiedad almacenada en Swift?
En Obj-C, puedo sobrescribir su setter, pero Swift no parece estar contento con el uso de getter / setters para la propiedad almacenada.
Digamos que tengo una Cardclase con una propiedad llamada rank. No quiero que el cliente le dé ningún valor no válido, por lo tanto, en el objetivo-C, puedo sobrescribir setRankpara que realice una verificación adicional. Pero willSeten Swift no parece ayudar porque newValuees constante y no tiene sentido asignar rankporque se llamará al setter en un bucle.

Respuestas:
Okay. Al leer la documentación de Apples en Swift, encontré esto :
Entonces todo lo que tienes que hacer es esto:
fuente
var rankTimesTwo: Int { get { return rank * 2 } }No puede anular
get/setpara una propiedad almacenada, pero puede usar observadores de propiedadwillSet/didSet:Los nombres de los parámetros predeterminados son
newValueparawillSetyoldValueparadidSet, o puede nombrarlos usted mismo como enwillSet(newTotalSteps).fuente
Cardclase con una propiedad llamadarank. No quiero que el cliente le dé ningún valor, por lo tanto, en el objetivo-C, puedo sobrescribirsetRankpara que realice una verificación adicional. PerowillSeten Swift no parece ayudar porquenewValuees constante y no tiene sentido asignarrankporque se llamará al setter en un bucle.didSetpara verificarrankdespués de que se configura y, si falla la validación, restablecerlo a otra cosa, por ejemplooldValue?get y set son para propiedades calculadas (no tienen ningún almacén de respaldo). (En mi opinión, la palabra clave 'var' es confusa aquí)
fuente
Si no desea utilizar didSet, que tiene el problema de que el valor de la propiedad es temporalmente incorrecto, debe envolverlo con una propiedad calculada.
O:
fuente
fooes solo una expresión calculada de_foo, ¡no dejes que la palabra clave "var" te engañe! Significa que hay dos entradas accesibles desde el espacio de nombres privado, pero eso no tiene relación con protected / public y mantiene el valor defooválido en todo momento. Este es esencialmente el patrón de "vista". El problema que surge con la reescritura a través dedidSet, además de tener un período de no ser válido, es que existe un potencial significativo para un bucle infinito ya que está volviendo a ingresar aldidSetcontrolador desde adentrodidSet.Ejemplo simplificado:
Ejemplo completo
Mira
perimetereste ejemplo.Extracto de: Apple Inc. "El lenguaje de programación Swift". iBooks. https://itun.es/us/jEUH0.l
fuente
perimetersigue siendo una propiedad calculada. ¿Cómo sobrescribo sideLength sin introducir una propiedad calculada?getyset