¿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 Card
clase 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 setRank
para que realice una verificación adicional. Pero willSet
en Swift no parece ayudar porque newValue
es constante y no tiene sentido asignar rank
porque 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
/set
para una propiedad almacenada, pero puede usar observadores de propiedadwillSet
/didSet
:Los nombres de los parámetros predeterminados son
newValue
parawillSet
yoldValue
paradidSet
, o puede nombrarlos usted mismo como enwillSet(newTotalSteps)
.fuente
Card
clase con una propiedad llamadarank
. No quiero que el cliente le dé ningún valor, por lo tanto, en el objetivo-C, puedo sobrescribirsetRank
para que realice una verificación adicional. PerowillSet
en Swift no parece ayudar porquenewValue
es constante y no tiene sentido asignarrank
porque se llamará al setter en un bucle.didSet
para verificarrank
despué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
foo
es 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 defoo
vá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 aldidSet
controlador desde adentrodidSet
.Ejemplo simplificado:
Ejemplo completo
Mira
perimeter
este ejemplo.Extracto de: Apple Inc. "El lenguaje de programación Swift". iBooks. https://itun.es/us/jEUH0.l
fuente
perimeter
sigue siendo una propiedad calculada. ¿Cómo sobrescribo sideLength sin introducir una propiedad calculada?get
yset