ios - stored - swift class constructor
Swift Programming: getter/setter en propiedad almacenada (5)
¿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 las propiedades almacenadas.
Supongamos que tengo una clase de Card
con una propiedad llamada rank
. No deseo 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
in Swift no parece ayudar porque newValue
es constante y no tiene sentido asignar rank
porque setter se llamará en un bucle.
Ejemplo simplificado:
class Shape {
var sideLength: Double {
get {
return self.sideLength
}
set {
// Implement the setter here.
self.sideLength = newValue
}
}
}
Ejemplo completo
Mira el perimeter
en este ejemplo.
Extracto de: Apple Inc. "The Swift Programming Language". IBooks. https://itun.es/us/jEUH0.l
class EquilateralTriangle: NamedShape {
var sideLength: Double = 0.0
init(sideLength: Double, name: String) {
self.sideLength = sideLength
super.init(name: name)
numberOfSides = 3
}
var perimeter: Double {
get {
return 3.0 * sideLength
}
set {
sideLength = newValue / 3.0
}
}
override func simpleDescription() -> String {
return "An equilateral triagle with sides of length /(sideLength)."
}
}
var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
triangle.perimeter
triangle.perimeter = 9.9
triangle.sideLength”
De acuerdo. Al leer la documentación de Apples en Swift, encontré this :
Si asigna un valor a una propiedad dentro de su propio observador didSet, el nuevo valor que asigne reemplazará al que acaba de establecer.
Entonces todo lo que tienes que hacer es esto:
var rank: Int = 0 {
didSet {
// Say 1000 is not good for you and 999 is the maximum you want to be stored there
if rank >= 1000 {
rank = 999
}
}
}
No puede anular la get
/ set
de una propiedad almacenada, pero puede usar los observadores de propiedad willSet
/ didSet
:
var totalSteps: Int = 0 {
willSet(newTotalSteps) {
println("About to set totalSteps to /(newTotalSteps)")
}
didSet {
if totalSteps > oldValue {
println("Added /(totalSteps - oldValue) steps")
}
}
}
Los nombres de parámetros predeterminados son newValue
para willSet
y oldValue
para didSet
, o usted mismo puede nombrarlos como willSet(newTotalSteps)
.
Si no desea utilizar didSet, que tiene el problema de que el valor de la propiedad es temporalmente incorrecto, debe envolver una propiedad calculada alrededor de él.
private var _foo:Int = 0
var foo:Int {
get {
return _foo
}
set {
if(newValue > 999) {
_foo = 999
} else {
_foo = newValue
}
}
}
O:
private var _foo:Int = 0
var foo:Int {
get {
return _foo
}
set {
guard newValue <= 999 else {
_foo = 999
return
}
_foo = newValue
}
}
get y set son para propiedades calculadas (no tienen ninguna tienda de respaldo). (En mi opinión, la palabra clave ''var'' es confusa aquí)
- willSet y didSet son llamados para una variable de instancia (Use didSet para anular cualquier cambio)
- establecer y obtener son puramente para propiedades calculadas