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){
}
}
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'
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
.
configurer :
get
set
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 :
willSet
didSet
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é.
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
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
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