¿Es normal que la propiedad var diferida se inicialice dos veces?

He conocido casos muy raros de usar una propiedad conlazy palabra clave. Sé que esta palabra clave indica que una inicialización de una propiedad se anula hasta que la variable realmente se usa y simplemente se ejecutauna vez.

Sin embargo, encontré un caso que ejecuta una inicialización dos veces.

class TestLazyViewController: UIViewController {

    var name: String = "" {
        didSet {
            NSLog("name self = \(self)")
            testLabel.text = name
        }
    }

    lazy var testLabel: UILabel = {
        NSLog("testLabel self = \(self)")
        let label = UILabel()
        label.text = "hello"
        self.view.addSubview(label)
        return label
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        testLabel.setTranslatesAutoresizingMaskIntoConstraints(false)
        NSLayoutConstraint.activateConstraints([NSLayoutConstraint(item: testLabel, attribute: .CenterX, relatedBy: .Equal, toItem: self.view, attribute: .CenterX, multiplier: 1.0, constant: 0.0)])
        NSLayoutConstraint.activateConstraints([NSLayoutConstraint(item: testLabel, attribute: .CenterY, relatedBy: .Equal, toItem: self.view, attribute: .CenterY, multiplier: 1.0, constant: 0.0)])
    }

    @IBAction func testButton(sender: AnyObject) {
        testLabel.text = "world"
    }
}

Escribí un controlador de vista para una prueba. Este controlador de vista es presentado por otro controlador de vista. Entonces,name la propiedad se establece enprepareForSegue del controlador de vista de presentación.

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let vc = segue.destinationViewController as! TestLazyViewController
    println("vc = \(vc)")
    vc.name = "hello"
}

Después de ejecutar la prueba, pude obtener el siguiente resultado.

vc = <testLazy.TestLazyViewController: 0x7fb3d1d16ec0>
2015-05-25 00:26:15.673 testLazy[95577:22267122] name self = <testLazy.TestLazyViewController: 0x7fb3d1d16ec0>
2015-05-25 00:26:15.673 testLazy[95577:22267122] testLabel self = <testLazy.TestLazyViewController: 0x7fb3d1d16ec0>
2015-05-25 00:26:15.674 testLazy[95577:22267122] testLabel self = <testLazy.TestLazyViewController: 0x7fb3d1d16ec0>

Como puede ver, un código de inicialización se ejecuta dos veces. No sé si es un error o un mal uso. ¿Hay alguien que me haga saber lo que está mal?

También tengo una suposición de que no es correcto lo quetestLabel se agrega aself.view en el código de inicialización. No estoy seguro de que el código sea incorrecto. Es solo mi suposición.

ACTUALIZAR:
Todavía no entiendo por qué la inicialización diferida se ejecuta dos veces. ¿Es realmente el error de Swift?

ACTUALIZACIÓN FINAL:
@matt ha hecho una excelente explicación para este problema que se inicializa dos veces. Aunque todas las cosas provienen de mi código incorrecto, podría obtener un valioso conocimiento de cómolazy La palabra clave funciona. Gracias Matt

Respuestas a la pregunta(1)

Su respuesta a la pregunta