Swift perezoso crear instancias usando uno mismo

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).