Я встретил очень странный случай использования свойства с ключевым словом lazy
. Я знаю, что это ключевое слово указывает, что инициализация свойства отложена до тех пор, пока фактически не будет использована переменная, и просто запустится один раз.
Тем не менее, я нашел случай, запускающий инициализацию дважды.
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"
}
}
Я написал контроллер представления для теста. Этот контроллер представления представлен другим контроллером представления. Затем свойство name
задается в prepareForSegue
контроллера представления представления.
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let vc = segue.destinationViewController as! TestLazyViewController
println("vc = \(vc)")
vc.name = "hello"
}
После запуска теста я смог получить следующий результат.
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>
Как вы можете видеть, код инициализации выполняется дважды. Я не знаю, что это ошибка или неправильное использование. Есть ли кто-нибудь, кто позволяет мне знать, что не так?
У меня также есть предположение, что неверно, что testLabel
добавлен в self.view
в код инициализации. Я не уверен, что код неверен. Это только моя догадка.
UPDATE:
Я до сих пор не понимаю, почему ленивая инициализация выполняется дважды. Это действительно ошибка Swift?
ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ:
@matt отлично объяснил, что эта проблема инициализируется дважды. Хотя все это исходит из моего неправильного кода, я мог бы получить ценные знания о том, как работает ключевое слово lazy
. Спасибо матовый.