with stored protocol property extension cannot ios swift

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