web-dev-qa-db-fra.com

Différence entre la propriété calculée et le jeu de propriétés avec fermeture

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
    }
}
47
bakalolo

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. 

82
Rob

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).

5
Qbyte

Fermeture :

  //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 . .

Propriété calculée:

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.

5
vikas prajapati

Ce n'est pas une réponse, mais ça vaut la peine de le mentionner pour:

  • Une propriété stockée dont la valeur doit être connue après initialisation. Cela se produit par défaut ou par initialisation. 
  • La valeur d'une propriété calculée n'est pas calculée tant qu'elle n'est pas utilisée
  • La valeur d'une propriété chargée paresseuse n'est pas définie tant qu'elle n'est pas utilisée

par conséquent, pour les variables calculées et variables, vous pouvez accéder à self ou aux propriétés stockées sans souci. 

0
Honey