property lazy computed swift lazy-initialization computed-properties

lazy - swift methods



¿Se calculan los vars perezosos en Swift más de una vez? (2)

No, las propiedades perezosas se inicializan solo una vez. Si establece un nuevo valor, o restablece a cero (para propiedades opcionales), el inicializador perezoso no se invoca de nuevo.

Creo que lo que necesita es una propiedad computada, no está respaldada por una propiedad almacenada, por lo que no está involucrada en la inicialización, y como tal puede referirse a otras propiedades de instancia.

¿Por qué dice que "vars calculados normales (no perezosos) no puedo acceder a otras variables de instancia"?

¿Se calculan los vars perezosos en Swift más de una vez? Tenía la impresión de que reemplazaron a:

if (instanceVariable) { return instanceVariable; } // set up variable that has not been initialized

Paradigma de Objective-C (instanciación perezosa).

¿Es eso lo que hacen? Básicamente, solo se llama una vez la primera vez que la aplicación solicita la variable, luego solo devuelve lo que se calculó.

¿O se llama cada vez como una propiedad computada normal?

La razón por la que pregunto es porque básicamente quiero una propiedad computada en Swift que pueda acceder a otras variables de instancia. Digamos que tengo una variable llamada "fullName" y simplemente concatena firstName y lastName . ¿Cómo haría eso en Swift? Parece que los vars perezosos son la única manera de ir, ya que en vars computados normales (no perezosos) no puedo acceder a otras variables de instancia.

Así que básicamente:

¿Vars perezosos en Swift se llaman más de una vez? Si es así, ¿cómo creo una variable computada que pueda acceder a las variables de instancia? De lo contrario, si solo quiero que una variable se calcule una vez por razones de rendimiento, ¿cómo hago esto?


lazy var solo se calculan una vez, la primera vez que las usa Después de eso, son como una variable normal.

Esto es fácil de probar en un patio de recreo:

class LazyExample { var firstName = "John" var lastName = "Smith" lazy var lazyFullName : String = { [unowned self] in return "/(self.firstName) /(self.lastName)" }() } let lazyInstance = LazyExample() println(lazyInstance.lazyFullName) // John Smith lazyInstance.firstName = "Jane" println(lazyInstance.lazyFullName) // John Smith lazyInstance.lazyFullName = "???" println(lazyInstance.lazyFullName) // ???

Si desea volver a calcularlo más tarde, use una propiedad computada (con una variable de respaldo, si es costosa), tal como lo hizo en Objective-C.