skyfloatinglabeltextfield page control swift computed-properties

swift - page - Diferencia entre propiedad calculada y conjunto de propiedades con cierre



skyfloatinglabeltextfield (4)

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


Cierre:

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

La primera vez, cuando se llama a la variable pushBehavior, se ejecuta el bloque y el valor se guarda en la variable pushBehavior. después de eso, siempre que llame a pushBehavior, se devolverán esos valores.

significa solo el primer código de bloque ejecutado y guardado en esta variable. Además, puede almacenar el valor de la variable cuando lo desee, pero después de eso, el valor devuelto, 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 llamó variable pushBehavior, este bloque ejecuta y devuelve valor. así que cada vez que se ejecuta el bloque. y no puede declarar la variable como palabra clave "let" para la variable pushBehavior.

Por lo tanto, puede usar este código según sus requisitos.


Esta no es una respuesta, pero vale la pena mencionar eso para:

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

por lo tanto, para las variables calculadas y perezosas, puede acceder a las propiedades self o almacenadas sin preocupaciones.


La primera es una propiedad almacenada que se inicializa a través de un cierre. El segundo es una propiedad calculada.

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 con let ). Esto es útil cuando desea encapsular el código para inicializar una propiedad almacenada en un único bloque de código conciso.

Sin embargo, el bloque de propiedades calculadas se llama cada vez que hace referencia a la variable. Es útil cuando desea que se invoque el código cada vez que hace referencia a la propiedad calculada. Generalmente, hace esto cuando la propiedad calculada necesita ser recalculada cada vez que hace referencia a la propiedad almacenada (por ejemplo, recalculada desde otras propiedades almacenadas, posiblemente privadas).

En este caso, sin duda desea la propiedad almacenada (el primer ejemplo), no la propiedad calculada (el segundo ejemplo). Probablemente no desee un nuevo objeto de comportamiento de inserción cada vez que haga referencia a la variable.

Por cierto, en su primer ejemplo, hace referencia internamente a que se instancia de manera perezosa. Si desea ese comportamiento, debe usar la palabra clave lazy :

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

Sin embargo, si la propiedad es static , se instancia automáticamente de manera perezosa.


La principal diferencia es que no 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 de retorno 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 deben usarse si el valor se puede recuperar rápidamente.

Nota al margen: si no cambia / reasigna la variable almacenada, debería considerar hacerla constante ( let )