Comment écraser le setter de la propriété stockée dans Swift?
Dans Obj-C, je peux écraser son setter, mais Swift ne semble pas être content de l'utilisation de getter / setters pour la propriété stockée.
Disons que j'ai une Card
classe avec une propriété appelée rank
. Je ne veux pas que le client lui donne une valeur invalide, par conséquent, dans objective-C, je peux écraser setRank
pour qu'il effectue une vérification supplémentaire. Mais willSet
dans Swift ne semble pas aider parce que newValue
c'est constant et cela n'a aucun sens d'assigner rank
parce que le setter sera appelé dans une boucle.
Réponses:
D'accord. En lisant la documentation d'Apples sur Swift, j'ai trouvé ceci :
Donc, tout ce que vous avez à faire est ceci:
la source
var rankTimesTwo: Int { get { return rank * 2 } }
Vous ne pouvez pas remplacer
get
/set
pour une propriété stockée, mais vous pouvez utiliser des observateurs de propriétéwillSet
/didSet
:Les noms de paramètres par défaut sont
newValue
pourwillSet
etoldValue
pourdidSet
, ou vous pouvez les nommer vous-même comme danswillSet(newTotalSteps)
.la source
Card
classe avec une propriété appeléerank
. Je ne veux pas que le client lui donne une valeur, par conséquent, dans objective-C, je peux écrasersetRank
afin qu'il effectue une vérification supplémentaire. MaiswillSet
dans Swift ne semble pas aider parce quenewValue
c'est constant et cela n'a aucun sens d'assignerrank
parce que le setter sera appelé dans une boucle.didSet
pour vérifierrank
après avoir été défini et si la validation échoue, réinitialisez-le à autre chose, par exempleoldValue
?get et set sont pour les propriétés calculées (ils n'ont pas de stockage de sauvegarde). (À mon avis, le mot-clé 'var' est déroutant ici)
la source
Si vous ne souhaitez pas utiliser didSet, qui présente le problème que la valeur de la propriété est temporairement incorrecte, vous devez entourer une propriété calculée.
Ou:
la source
foo
est juste une expression calculée de_foo
, ne vous laissez pas tromper par le mot-clé "var"! Cela signifie qu'il y a deux entrées accessibles à partir de l'espace de noms privé, mais cela n'a aucune incidence sur protected / public et garde la valeur defoo
valide à tout moment. Il s'agit essentiellement du modèle «vue». Le problème que vous rencontrez avec la réécriture viadidSet
, en plus du fait qu'elle a une période d'invalidité, est qu'il y a un potentiel important pour une boucle infinie puisque vous réentrez ledidSet
gestionnaire de l'intérieurdidSet
.Exemple simplifié:
Exemple complet
Découvrez
perimeter
cet exemple.Extrait de: Apple Inc. «The Swift Programming Language». iBooks. https://itun.es/us/jEUH0.l
la source
perimeter
est toujours une propriété calculée. Comment écraser sideLength sans introduire de propriété calculée?get
etset