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 propiedadesLos 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
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