Je suis nouveau à Swift. Quelle est la différence entre une propriété calculée et un ensemble de propriétés associé à une fermeture? Je sais qu'une propriété calculée est recalculée à chaque fois. Est-ce différent pour la fermeture? c'est à dire.
Fermeture:
var pushBehavior: UIPushBehavior = {
let lazilyCreatedPush = UIPushBehavior()
lazilyCreatedPush.setAngle(50, magnitude: 50)
return lazilyCreatedPush
}()
Calculé:
var pushBehavior: UIPushBehavior {
get{
let lazilyCreatedPush = UIPushBehavior()
lazilyCreatedPush.setAngle(50, magnitude: 50)
return lazilyCreatedPush
}
}
Le premier est une propriété stockée qui est initialisée via une fermeture. La seconde est une propriété calculée.
La fermeture de l'initialisation de la propriété stockée est appelée une fois et une seule fois, mais vous pouvez modifier ultérieurement la valeur de la propriété stockée (sauf si vous remplacez var
par let
). Cela est utile lorsque vous souhaitez encapsuler le code pour initialiser une propriété stockée dans un seul bloc de code concis.
Toutefois, le bloc de la propriété calculée est appelé chaque fois que vous référencez la variable. C’est utile lorsque vous souhaitez que le code soit appelé chaque fois que vous référencez la propriété calculée. En règle générale, vous procédez ainsi lorsque la propriété calculée doit être recalculée chaque fois que vous référencez la propriété stockée (par exemple, recalculée à partir d'autres propriétés stockées, éventuellement privées).
Dans ce cas, vous voulez sans doute la propriété stockée (le premier exemple), pas la propriété calculée (le second exemple). Vous ne voulez probablement pas d'un nouvel objet de comportement Push chaque fois que vous référencez la variable.
En passant, dans votre premier exemple, vous faites référence en interne à son instanciation paresseuse. Si vous souhaitez ce comportement, vous devez utiliser le mot clé lazy
:
lazy var pushBehavior: UIPushBehavior = {
let lazilyCreatedPush = UIPushBehavior()
lazilyCreatedPush.setAngle(50, magnitude: 50)
return lazilyCreatedPush
}()
Si, toutefois, la propriété est static
, elle est automatiquement instanciée paresseusement.
La principale différence est que vous ne pouvez pas affecter quelque chose à la propriété calculée car elle n'a pas de paramètre. Dans ce cas, la fermeture n'est appelée qu'une fois et la valeur de retour est stockée dans la variable. Par conséquent, si le résultat ne change pas dans le temps, il est plus efficace d'utiliser la variable stockée plutôt que celle calculée.
En général: les propriétés calculées ne doivent être utilisées que si la valeur peut être récupérée rapidement.
Remarque: Si vous ne modifiez/réaffectez pas la variable stockée, vous devriez envisager de la transformer en constante (let
).
//closure
var pushBehavior: UIPushBehavior = {
let lazilyCreatedPush = UIPushBehavior()
lazilyCreatedPush.setAngle(50, magnitude: 50)
return lazilyCreatedPush
}()
Au premier moment où la variable pushBehavior est appelée, la commande block execute et la valeur est enregistrée dans la variable pushBehavior. après cela, chaque fois que vous appelez pushBehavior, ces valeurs sont renvoyées.
signifie que seul le code de bloc initial exécuté et enregistré dans cette variable . .
var pushBehavior: UIPushBehavior {
get{
let lazilyCreatedPush = UIPushBehavior()
lazilyCreatedPush.setAngle(50, magnitude: 50)
return lazilyCreatedPush
}
}
Dans la propriété calculée, chaque fois que vous appelez une variable pushBehavior, ce bloc est exécuté et la valeur renvoyée. de sorte que chaque bloc de temps est exécuté . et vous ne pouvez pas déclarer variable en tant que mot clé "let" pour la variable pushBehavior.
Ainsi, vous pouvez utiliser ce code selon vos besoins.
Ce n'est pas une réponse, mais ça vaut la peine de le mentionner pour:
par conséquent, pour les variables calculées et variables, vous pouvez accéder à self
ou aux propriétés stockées sans souci.