Tengo algo que realmente me desconcierta, específicamente el siguiente código desencadena un error de comstackción “identificador no resuelto”, y no estoy seguro de por qué sucede esto, ya que perezoso significa que en el momento en que se utilizará la propiedad, la clase ya está instanciada . ¿Me estoy perdiendo de algo?
Muchas gracias de antemano.
Aquí está el código
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() } }
Por alguna razón, una propiedad floja necesita una anotación de tipo explícita 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 comstack y se ejecuta como se esperaba.
Aquí hay otro ejemplo que demuestra que el problema también ocurre con struct
s, es decir, que no está relacionado con la creación de subclases:
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 comstack solo con una anotación de tipo explícito.
Actualización: esto se ha corregido en Swift 4 / Xcode 9 beta 3, los inicializadores de propiedad diferidos ahora pueden hacer referencia a los miembros de la instancia sin self
explícita y sin anotación de tipo explícita. (Gracias a @hamish por la actualización).