swift initialization lazy-initialization

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