Swift perezoso instanciando usando self
initialization lazy-initialization (1)
Por alguna razón, una propiedad perezosa necesita una anotación de tipo explícito si su valor inicial se refiere a
self
.
Esto se menciona en la
lista de correo de evolución rápida
, sin embargo, no puedo explicar
por qué
es necesario.
Con
lazy var first: FirstClass = FirstClass(second: self)
// ^^^^^^^^^^^^
su código se compila y se ejecuta como se esperaba.
Aquí hay otro ejemplo que demuestra que el problema también ocurre con las
struct
, es decir, no está relacionado con la subclasificación:
func foo(x: Int) -> Int { return x + 1 }
struct MyClass {
let x = 1
lazy var y = foo(0) // No compiler error
lazy var z1 = foo(self.x) // error: use of unresolved identifier ''self''
lazy var z2: Int = foo(self.x) // No compiler error
}
El valor inicial de
y
no depende de
self
y no necesita una anotación de tipo.
Los valores iniciales de
z1/z2
dependen de
self
, y solo se compila con una anotación de tipo explícito.
Actualización:
Esto
se ha solucionado
en Swift 4 / Xcode 9 beta 3, los inicializadores de propiedades diferidas ahora pueden hacer referencia a miembros de instancia sin
self
explícito y sin anotaciones de tipo explícito.
(Gracias a @hamish por la actualización).
Tengo algo que realmente me desconcierta, específicamente el siguiente código desencadena un error del compilador "identificador no resuelto", y no estoy seguro de por qué sucede esto, ya que perezoso significa que en el momento en que se usará la propiedad, la clase ya está instanciada . ¿Me estoy perdiendo de algo?
Muchas gracias de antemano.
Aqui esta el codigo
class FirstClass {
unowned var second: SecondClass
init(second:SecondClass) {
self.second = second
print("First reporting for duty")
}
func aMethod() {
print("First''s method reporting for duty")
}
}
class SecondClass {
lazy var first = FirstClass(second: self)
func aMethod() {
first.aMethod()
}
}