web-dev-qa-db-fra.com

swift willSet DidSet et obtenir les méthodes définies dans une propriété

Quelle est la différence entre willSet - didSet et get - set lorsque vous travaillez avec cela dans une propriété?

De mon point de vue, les deux peuvent définir une valeur pour une propriété. Quand et pourquoi devrais-je utiliser willSet - didSet, et quand get - set?

Je sais que pour willSet et didSet, la structure ressemble à ceci:

var variable1 : Int = 0 {
    didSet {
        println (variable1)
    }
    willSet(newValue) {
    ..
    }
}

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

Quand et pourquoi devrais-je utiliser willSet/didSet

  • willSet est appelé simplement avant la valeur est stockée.
  • didSet est appelé immédiatement after la nouvelle valeur est stockée.

Considérez votre exemple avec des sorties:


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")

Sortie:

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

cela fonctionne comme pré/post-condition

D'autre part, vous pouvez utiliser get si vous souhaitez ajouter, par exemple, une propriété en lecture seule:

var value : Int {
 get {
    return 34
 }
}

print(value)

value = 2 // error: cannot assign to a get-only property 'value'
45
Maxim Shoustin

La réponse de @ Maxim concerne la première partie de votre question.

Quant à savoir quand utiliser get et set: quand vous voulez une propriété calculée. Cette:

var x: Int

crée une propriété stockée, qui est automatiquement sauvegardée par une variable (non directement accessible cependant). Le fait de définir une valeur pour cette propriété est traduit en définissant la valeur dans la propriété et de la même manière pour obtenir.

Au lieu:

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

créera une propriété calculée, qui n'est pas sauvegardée par une variable - vous devez plutôt fournir l'implémentation du getter et/ou du setter, généralement en lisant et en écrivant les valeurs d'une autre propriété et plus généralement à la suite d'un calcul (d'où propriété calculée nom)

Lecture suggérée: Propriétés

Remarque : votre code:

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

est faux car dans le get, vous essayez de revenir en arrière, ce qui signifie que vous appelez get récursivement. Et en fait, le compilateur vous avertira avec un message du type Attempting to access 'variable2' within its own getter.

23
Antonio

configurer :

getset sont les propriétés calculées qui ne stockent pas réellement de valeur . Au lieu de cela, ils fournissent un getter et un setter optionnel pour récupérer et définir indirectement d'autres propriétés et valeurs

De plus, vous pouvez définir des propriétés calculées en lecture seule. Une propriété calculée en lecture seule renvoie toujours une valeur et est accessible via la syntaxe à points, mais ne peut pas être définie sur une valeur différente.

Exemple obtenir uniquement une propriété -

 var number: Double {
        return .pi*2
    }

willSet didSet :

willSetdidSet sont des observateurs de propriété

Les observateurs des biens observent et réagissent aux changements de la valeur d’un bien. Les observateurs de propriété sont appelés chaque fois qu'une valeur de propriété est définie, même si la nouvelle valeur est identique à la valeur actuelle de la propriété.

  • willSet est appelé juste avant que la valeur ne soit stockée.
  • didSet est appelé immédiatement après le stockage de la nouvelle valeur.

Exemple -

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

2
Jack
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){
    }
}

Pour des informations détaillées sur Propriété Store et propriété calculée
Ainsi, lorsque vous essayez d'attribuer la valeur à une variable à ce moment, le concept de 'didSet' & 'willSet' vient. Comme @ Maxim dit

  • willSet est appelé juste avant la valeur est stockée.
  • didSet est appelé immédiatement après la nouvelle valeur est stockée.


Exemple 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:
nous allons ajouter 3
willSet appelé
didSet a appelé
nous avons ajouté 3

Et généralement, lorsque deux propriétés dépendent à ce moment-là, "get" & "set" sont utilisées. (Il est également utilisé dans protocole c'est un concept différent.)

Exemple de 'get' & 'set':

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
1
NiravS