J’apprends Swift et je lis The Swift Programming Language
de The Swift Programming Language
d’Apple, je n’ai pas d’arrière-plan Objective C (seulement PHP, JS et autres mais pas d’Obj C)
À la page 24-25 je vois ce code:
//...Class definition stuff... var perimeter: Double { get { return 3.0 * sideLength } set { sideLength = newValue / 3.0 } } //...Class continues...
Cette partie n’est PAS spécifiée dans le livre et je ne peux pas obtenir quoi que ce soit.
Quelqu’un peut-il m’expliquer ce que cela va et ce sont ensemble ?
C’est en fait expliqué juste avant le code:
Outre les propriétés simples stockées, les propriétés peuvent avoir un getter et un setter.
class EquilateralTriangle: NamedShape { ...
Quand une autre classe veut obtenir cette variable de périmètre, elle le fait:
let someVar = myTriangle.perimeter
… qui appelle cela:
get{ return 3.0 * self.sideLength }
Et c’est essentiellement comme si le contrôleur appelant faisait ceci:
let someVar = 3.0 * myTriangle.sideLength
Lorsque vous définissez la variable à partir d’un autre object, cela ressemble à ceci:
myTriangle.perimeter = 100
Qui appelle le code dans le bloc set{}
:
set { sideLength = newValue / 3.0 }
Et c’est comme si la classe qui définissait la variable avait fait ceci:
myTriangle.sideLength = 100/3.0
C’est juste pour plus de commodité – vous pouvez appeler cela depuis un autre code sans avoir à diviser par 3 ou tout le temps, car cela se fait juste avant de définir la variable et juste avant d’obtenir la variable.
Dans Swift, nous pouvons avoir des propriétés qui sont calculées lorsqu’elles sont obtenues et peuvent faire quelque chose lorsqu’elles sont définies. Nous pourrions faire cela en Objective-C aussi:
// .h @property (nonatomic) double perimeter; //.m - (double)perimeter { return self.sideLength * 3.0; } - (void)setPerimeter:(double)perimeter { self.perimeter = perimeter; // In Swift, this is done automatically. self.sideLength = perimeter / 3.0; }
L’obtention et la définition de variables dans les classes se rapportent à la récupération (“get”) ou à la modification (“setting”) de leur contenu.
Considérons une variable members
d’une family
classe. Naturellement, cette variable devrait être un entier, car une famille ne peut jamais être composée de deux points.
Donc, vous devriez probablement aller de l’avant en définissant la variable members
comme ceci:
class family { var members:Int }
Ceci, cependant, donnera aux personnes utilisant cette classe la possibilité de définir le nombre de membres de la famille à 0 ou 1. Et comme il n’ya pas de famille de 1 ou 0, c’est dommage.
C’est là que les getters et les installateurs interviennent. De cette façon, vous pouvez décider vous-même de la manière dont les variables peuvent être modifiées et des valeurs qu’elles peuvent recevoir, ainsi que du contenu qu’elles renvoient.
En revenant à notre classe de famille, faisons en sorte que personne ne puisse définir la valeur des members
à moins de 2:
class family { var _members:Int = 2 var members:Int { get { return _members } set (newVal) { if newVal >= 2 { _members = newVal } else { println('error: cannot have family with less than 2 members') } } } }
Maintenant, nous pouvons accéder à la variable members
comme auparavant, en tapant instanceOfFamily.members
, et grâce à la fonction setter, nous pouvons également définir sa valeur comme auparavant, en tapant, par exemple: instanceOfFamily.members = 3
. Ce qui a changé, cependant, c’est le fait que nous ne pouvons plus définir cette variable sur une valeur inférieure à 2.
Notez l’introduction de la variable _members
, qui est la variable réelle pour stocker la valeur que nous définissons via la fonction setter des members
. Les members
origine members
maintenant devenus une propriété calculée, ce qui signifie qu’ils n’agissent que comme une interface pour gérer notre variable réelle.
Une question simple devrait être suivie d’une réponse courte, simple et claire.
Lorsque nous obtenons une valeur de la propriété, elle déclenche sa partie get{}
.
Lorsque nous définissons une valeur pour la propriété, elle déclenche sa partie set{}
.
PS Lors de la définition d’une valeur pour la propriété, SWIFT crée automatiquement une constante nommée “newValue” = une valeur que nous définissons. Après qu’une constante “newValue” devienne accessible dans la partie set{}
la propriété.
Exemple:
var A:Int = 0 var B:Int = 0 var C:Int { get {return 1} set {print("Recived new value", newValue, " and stored into 'B' ") B = newValue } } //When we are getting a value of C it fires get{} part of C property A = CA //Now A = 1 //When we are setting a value to C it fires set{} part of C property C = 2 B //Now B = 2
Vous devriez regarder les propriétés calculées
Dans votre exemple de code, le perimeter
est une propriété non sauvegardée par une variable de classe, mais sa valeur est calculée à l’aide de la méthode get
et stockée via la méthode set
– généralement appelée getter et setter .
Lorsque vous utilisez cette propriété comme ceci:
var cp = myClass.perimeter
vous invoquez le code contenu dans le bloc de code get
et lorsque vous l’utilisez comme ceci:
myClass.perimeter = 5.0
vous invoquez le code contenu dans le bloc de code d’ensemble, où newValue
est automatiquement renseigné avec la valeur fournie à droite de l’opérateur d’affectation.
Les propriétés calculées peuvent être readwrite si un getter et un setter sont spécifiés, ou en lecture seule si seul le getter est spécifié.