具有自变量的惰性属性init

时间:2017-12-01 14:22:50

标签: ios swift lazy-initialization

注意:此问题出现在Xcode 8& Swift 3.1。 Xcode 9& Swift 4工作正常

我有一个带有惰性变量的简单视图控制器。它是从故事板中实例化的。这是代码:

import UIKit

final class ChildViewController: UIViewController {

    private lazy var barButton = UIBarButtonItem(barButtonSystemItem: .bookmarks, target: self, action: #selector(addBookmark))

    override func viewDidLoad() {
        super.viewDidLoad()

        navigationItem.rightBarButtonItems = [barButton]
    }

    func addBookmark() {
        print("Bookmark Added")
    }

}

问题是barButton变量未通过viewDidAppear(_:)调用初始化,而是在init(withCoder:)调用后直接初始化。此时自变量为nil。我尝试了自己的课,结果是一样的。

但是当我宣布像这样的懒惰变量时,一切都运行良好:

private lazy var barButton: UIBarButtonItem = {
    UIBarButtonItem(barButtonSystemItem: .bookmarks, target: self, action: #selector(addBookmark))
}()

为什么延迟变量是这样初始化的?`

您可以尝试example project

1 个答案:

答案 0 :(得分:0)

我无法运行它,但我认为这样可行,请尝试编写

   private lazy var barButton: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .bookmarks, target: self, action: #selector(addBookmark))