property lazy did computed ios swift properties didset

ios - lazy - swift willSet didSet y get set methods en una propiedad



didset swift 4 (4)

Cuándo y por qué debería usar willSet / didSet

  • Se llama a willSet justo antes de que se almacene el valor.
  • didSet se llama inmediatamente después de que se almacena el nuevo valor.

Considere su ejemplo con salidas:

var variable1 : Int = 0 { didSet{ print("didSet called") } willSet(newValue){ print("willSet called") } } print("we are going to add 3") variable1 = 3 print("we added 3")

Salida:

we are going to add 3 willSet called didSet called we added 3

funciona como pre / post-condición

Por otro lado, puede usar get si desea agregar, por ejemplo, una propiedad de solo lectura:

var value : Int { get { return 34 } } print(value) value = 2 // error: cannot assign to a get-only property ''value''

¿Cuál es la diferencia entre willSet - didSet , y get - set , cuando se trabaja con esto dentro de una propiedad?

Desde mi punto de vista, ambos pueden establecer un valor para una propiedad. ¿Cuándo y por qué debo usar willSet - didSet y cuándo get - set ?

Sé que para willSet y didSet , la estructura se ve así:

var variable1 : Int = 0 { didSet { println (variable1) } willSet(newValue) { .. } } var variable2: Int { get { return variable2 } set (newValue){ } }


La respuesta de @ Maxim es para la primera parte de su pregunta.

En cuanto a cuándo usar get y set : cuando quieres una propiedad calculada. Esta:

var x: Int

crea una propiedad almacenada , que se copia automáticamente por una variable (no accesible directamente). Establecer un valor para esa propiedad se traduce al establecer el valor en la propiedad, y de manera similar para obtener.

En lugar:

var y = { get { return x + 5 } set { x = newValue - 5} }

creará una propiedad calculada, que no está respaldada por una variable; en su lugar, debe proporcionar la implementación del captador y / o colocador, generalmente leyendo y escribiendo valores de otra propiedad y, en general, como resultado de un cálculo (de ahí el nombre de propiedad calculado )

Lectura sugerida: Properties

Nota : su código:

var variable2: Int { get{ return variable2 } set (newValue){ } }

está mal porque en el intento estás tratando de regresar a sí mismo, lo que significa llamar de manera recursiva. Y, de hecho, el compilador le advertirá con un mensaje como Attempting to access ''variable2'' within its own getter .


establecerse :

set son Propiedades calculadas que en realidad no almacenan un valor . En cambio, proporcionan un getter y un setter opcional para recuperar y establecer otras propiedades y valores indirectamente

Además, puede definir Propiedades computadas de solo lectura. Una propiedad calculada de solo lectura siempre devuelve un valor, y se puede acceder a través de la sintaxis de punto, pero no se puede establecer en un valor diferente

Ejemplo obtener solo propiedad-

var number: Double { return .pi*2 }

willSet didSet :

willSet didSet son observadores de propiedades

Los observadores de propiedad observan y responden a los cambios en el valor de una propiedad. Se llama a los observadores de propiedad cada vez que se establece el valor de una propiedad, incluso si el nuevo valor es el mismo que el valor actual de la propiedad.

  • Se llama a willSet justo antes de que se almacene el valor.
  • didSet se llama inmediatamente después de que se almacena el nuevo valor.

Ejemplo -

var score: Int = 0 { willSet(newScore) { print("willSet score to /(newScore)") } didSet { print("didSet score to /(oldValue) new score is: /(score)") } } score = 10 //Output //willSet score to 10 //didSet score to 0 new score is: 10

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html


var variable1 : Int = 0 { //It''s a store property didSet { print (variable1) } willSet(newValue) { .. } } var variable2: Int { //It''s a Computed Proprties get { return variable2 } set (newValue){ } }

Para obtener información detallada de la propiedad de la tienda y la propiedad calculada
Por lo tanto, cuando intente asignar el valor a la variable en ese momento de asignación, aparecerá el concepto de ''didSet'' y ''willSet''. Como dice @Maxim

  • Se llama a willSet justo antes de que se almacene el valor.
  • didSet se llama inmediatamente después de que se almacena el nuevo valor.


Ejemplo de ''willSet'' & ''didSet'':

class Number { var variable1 : Int = 0 { didSet{ print("didSet called") } willSet(newValue){ print("willSet called") } } } print("we are going to add 3") Number().variable1 = 3 print("we added 3")

// o / p:
vamos a agregar 3
willSet llamado
didSet llamado
agregamos 3

Y generalmente cuando dos propiedades son dependientes en ese momento, se usa ''get'' & ''set''. (También se usa en protocol este es un concepto diferente).

Ejemplo de ''obtener'' y ''establecer'':

class EquilateralTriangle{ var sideLength: Double = 0.0 init(sideLength: Double){ self.sideLength = sideLength } var perimeter: Double { get { return 3.0 * sideLength } set { sideLength = newValue / 3.0 } } } var triangle = EquilateralTriangle(sideLength: 3.0) print(triangle.perimeter) //o/p: 9.0 triangle.perimeter = 12.0 print(triangle.sideLength) //o/p: 4.0