É normal que a propriedade var preguiçosa seja inicializada duas vezes?

Eu conheci um caso muito estranho de usar uma propriedade comlazy palavra-chave Eu sei que essa palavra-chave indica que uma inicialização de uma propriedade é adiada até que a variável realmente esteja sendo usada e apenas seja executadauma vez.

No entanto, encontrei um caso executando uma inicialização duas vezes.

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"
    }
}

Eu escrevi um controlador de exibição para um teste. Este controlador de vista é apresentado por outro controlador de vista. Então,name A propriedade está definida emprepareForSegue do controlador de exibição de apresentação.

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

Depois de executar o teste, consegui o seguinte 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 você pode ver, um código de inicialização é executado duas vezes. Não sei se é um bug ou um mau uso. Existe alguém que me diga o que está errado?

Eu também acho que não está correto o quetestLabel é adicionado aself.view no código de inicialização. Não tenho certeza se o código está incorreto. É apenas o meu palpite.

ATUALIZAR:
Ainda não entendo por que a inicialização lenta é executada duas vezes. É realmente o bug do Swift?

ATUALIZAÇÃO FINAL:
O @matt fez uma excelente explicação para esse problema ser inicializado duas vezes. Embora todas as coisas venham do meu código incorreto, eu poderia obter um conhecimento valioso de comolazy palavra-chave funciona. Graças mate.

questionAnswers(1)

yourAnswerToTheQuestion