2017-08-20 3 views
1

je lisais à propos willset et didset des propriétés dans rapide, je suis venu pour savoir que je peux utiliser ces avec la variable ayant une valeur initiale comme ci-dessous:pouvons-nous utiliser willset et didset avec getter et setter

var property = "name" 
{ 
    willSet 
    { 
     print("property is about to changed") 
    } 
    didSet 
    { 
     if property == oldValue 
     { 
      print("values are same") 
     } 
     else 
     { 
      print("value changed") 
     } 
    } 
} 

property = "anothername" 

si puis-je utiliser willget et didset comme ci-dessous:

var property2:String{ 

    willSet 
    { 
     print("value is about to change") 
    } 
    didSet 
    { 
     print("value is changes") 
    } 
} 

il me donne cette erreur:

non-member observing properties require an initializer 
var property2:String{ 
    ^

si quelqu'un peut me expliquer ce qui se passe ici et puis-je utiliser getter et setter avec willset et didset ensemble comme:

var property2:String{ 

    get{return property2} 
    set{propert2 = newValue} 

    willSet 
    { 
     print("value is about to change") 
    } 
    didSet 
    { 
     print("value is changes") 
    } 
} 

Répondre

-1

De Apple Doc Classes et structures doivent mettre toutes leurs propriétés stockées à une valeur initiale appropriée au moment où une instance de cette classe ou structure est créée. Les propriétés stockées ne peuvent pas être laissées dans un état indéterminé.

de sorte que vous pouvez résoudre ce problème en ajoutant? var property2: String {

var property2:String?{ 

    willSet 
    { 
     print("value is about to change") 
    } 
    didSet 
    { 
     print("value is changes") 
    } 
} 
+1

Aucune infraction, mais un optionnel en remplacement d'un initialiseur manquant est la pire suggestion. – vadian

0
  • d'émission (deuxième snippet):

    La propriété/membre ne dispose pas d'une valeur initiale, c'est ce que le message d'erreur indique, vous avez besoin pour écrire un initialiseur ou affecter une valeur initiale comme dans le premier extrait. L'erreur n'est pas liée aux observateurs.

  • deuxième question (troisième extrait):

    observateurs de propriété dans les propriétés calculées ne sont pas autorisés. Votre exemple sans les observateurs ne fonctionne pas de toute façon (en supposant que propert2 est une faute de frappe et vous voulez dire property2). Le setter provoquera une boucle infinie parce qu'il s'appelle lui-même.

0

L'erreur qui dit que vous manque un initialiseur peut être résolu en donnant la propriété une valeur par défaut comme votre premier morceau de code a:

var property2:String = "Some default value"{ 

    willSet 
    { 
     print("value is about to change") 
    } 
    didSet 
    { 
     print("value is changes") 
    } 
} 

Maintenant, je répondrai pourquoi ne pas utiliser observateurs de propriété sur les propriétés calculées.

Parce qu'il n'y a pas de point.

Pour une propriété calculée, vous avez déjà le setter, de sorte que vous pouvez écrire le code que vous voulez exécuter lorsque la valeur est dans le setter. Pourquoi avez-vous besoin d'un supplément willSet ou didSet? Et pour une propriété calculée get-only, elle ne peut pas être définie alors quand pensez-vous que willSet et didSet seront exécutés?

Fondamentalement, le bloc set dans les propriétés calculées remplit déjà le but de willSet et didSet. Tout ce que vous écrivez willSet vous pouvez l'écrire dans set avant de définir la valeur.Tout ce que vous écrivez didSet, vous pouvez écrire set après avoir défini la valeur.

Notez également que votre troisième code peut provoquer un dépassement de pile puisque vous accédez à property2 à l'intérieur de son propre getter et que vous le définissez dans son propre setter.