Diferencia entre la propiedad calculada y la propiedad establecida con cierre


Soy nuevo en Swift. ¿Cuál es la diferencia entre una propiedad calculada y una propiedad establecida en un cierre? Sé que una propiedad calculada se recalcula cada vez. Es diferente para el cierre? es decir,

Cierre:

var pushBehavior: UIPushBehavior = {
    let lazilyCreatedPush = UIPushBehavior()
    lazilyCreatedPush.setAngle(50, magnitude: 50)
    return lazilyCreatedPush
}()

Calculado:

var pushBehavior: UIPushBehavior {
    get{
        let lazilyCreatedPush = UIPushBehavior()
        lazilyCreatedPush.setAngle(50, magnitude: 50)
        return lazilyCreatedPush
    }
}
Author: bakalolo, 2015-07-20

4 answers

La primera es una propiedad almacenada que se inicializa mediante un cierre. La segunda es una propiedad computada.

El cierre de inicialización de la propiedad almacenada se llama una vez y solo una vez, pero luego puede cambiar el valor de la propiedad almacenada (a menos que reemplace var por let). Esto es útil cuando desea encapsular el código para inicializar una propiedad almacenada en un solo bloque de código conciso.

El bloque de la propiedad calculada, sin embargo, se llama cada vez que hace referencia variable. Es útil cuando desea que se llame al código cada vez que haga referencia a la propiedad calculada. Generalmente lo hace cuando la propiedad calculada necesita ser recalculada cada vez que hace referencia a la propiedad almacenada (por ejemplo, recalculada de otras propiedades almacenadas, posiblemente privadas).

En este caso, sin duda desea la propiedad almacenada (el primer ejemplo), no la propiedad calculada (el segundo ejemplo). Es de suponer que no quieres un nuevo objeto de comportamiento push cada vez usted hace referencia a la variable.


Por cierto, en su primer ejemplo, internamente hace referencia a que se instanció perezosamente. Si quieres ese comportamiento, debes usar la palabra clave lazy:

lazy var pushBehavior: UIPushBehavior = {
    let lazilyCreatedPush = UIPushBehavior()
    lazilyCreatedPush.setAngle(50, magnitude: 50)
    return lazilyCreatedPush
}()

Si, sin embargo, la propiedad es static, se instanciará automáticamente perezosamente.

 74
Author: Rob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-18 16:37:52

La principal diferencia es que no se puede asignar algo a la propiedad calculada ya que no tiene setter. En este caso, el cierre solo se llama una vez y el valor devuelto se almacena en la variable, por lo que si el resultado no cambia con el tiempo, es más eficiente usar la variable almacenada en lugar de la calculada.

En general: las propiedades calculadas solo se deben usar si el valor se puede recuperar rápidamente.

Nota lateral: Si no cambias / reasignas el archivo almacenado variable deberías considerar convertirla en una constante (let)

 5
Author: Qbyte,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-20 12:02:32

Cierre :

  //closure
    var pushBehavior: UIPushBehavior = {
        let lazilyCreatedPush = UIPushBehavior()
        lazilyCreatedPush.setAngle(50, magnitude: 50)
        return lazilyCreatedPush
    }()

En la primera vez cuando se llama a la variable pushBehavior, el bloque ejecuta y el valor se guarda en la variable pushBehavior. después de eso, cada vez que llame a pushBehavior, se devuelven esos valores.

Significa que solo se ejecuta el código de bloque por primera vez y se guarda en esta variable. Además, puede almacenar el valor de la variable cuando lo desee, pero después de eso, los valores devueltos, pero si declara como "let", entonces no puede cambiar este valor.

Propiedad calculada :

var pushBehavior: UIPushBehavior {
    get{
        let lazilyCreatedPush = UIPushBehavior()
        lazilyCreatedPush.setAngle(50, magnitude: 50)
        return lazilyCreatedPush
    }
}

En la propiedad calculada cada vez que llame a la variable pushBehavior, este bloque se ejecuta y devuelve el valor. así que cada bloque de tiempo se ejecuta. y no puede declarar la variable como palabra clave " let " para la variable pushBehavior.

Así que usted puede utilizar este código según su requisito.

 4
Author: vikas prajapati,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-25 05:44:08

Esto no es una respuesta, pero vale la pena mencionarlo para:

  • A propiedades almacenadas el valor debe conocerse después de la inicialización. Eso sucede ya sea por defecto o a través de la inicialización.
  • El valor de una propiedad calculada no se calcula hasta que se accede
  • El valor de una propiedad lazy loaded no se define hasta que se accede

Por lo tanto, tanto para variables calculadas como perezosas, puede acceder a self o propiedades almacenadas sin preocupaciones.

 0
Author: Honey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-13 20:34:06