为什么在 viewDidLoad() 之外的初始化会失败?

Why does initialisation outside of `viewDidLoad()` fail?

这不编译:

class ViewController: NSViewController, NSTableViewDataSource, NSTableViewDelegate {

    let fileManager = NSFileManager.defaultManager()

    let dir: NSURL? = NSURL.fileURLWithPath("/Users/wilfred/")

    var error: NSError? = nil

    var folderContents: [NSURL]? = fileManager.contentsOfDirectoryAtURL(dir!, includingPropertiesForKeys: nil, options: NSDirectoryEnumerationOptions(), error: &error) as [NSURL]?

……但这确实是:

class ViewController: NSViewController, NSTableViewDataSource, NSTableViewDelegate {

    let fileManager = NSFileManager.defaultManager()

    let dir: NSURL? = NSURL.fileURLWithPath("/Users/wilfred/")

    var error: NSError? = nil

    var folderContents: [NSURL]? = nil

    override func viewDidLoad() {
        super.viewDidLoad()
        self.folderContents =  fileManager.contentsOfDirectoryAtURL(dir!, includingPropertiesForKeys: nil, options: NSDirectoryEnumerationOptions(), error: &error) as [NSURL]?
    }

请注意,我只从声明块中取出用于初始化 folderContents 的块,并将其复制到 viewDidLoad() 块中。为什么!?!?!

我得到的错误是:

…这对我来说似乎是假的。

docu 的某个地方指出在第一种情况下你需要 self:

class ViewController: NSViewController, NSTableViewDataSource, NSTableViewDelegate {
  let fileManager = NSFileManager.defaultManager()
  let dir: NSURL? = NSURL.fileURLWithPath("/Users/wilfred/")
  var error: NSError? = nil
  lazy var folderContents: [NSURL]? = self.fileManager.contentsOfDirectoryAtURL(self.dir!, includingPropertiesForKeys: nil, options: NSDirectoryEnumerationOptions(), error: &self.error) as [NSURL]?
}

属性是在self创建之前初始化的,所以当你想在folderContents中获取fileManager时,也就是self.fileManager,self是不存在的,所以无法获取任何 属性 的自我。 例如,如果您覆盖任何 class 的 init 方法,在其中放置一个断点并将断点指向属性,执行代码,您可以看到首先到达的是属性,而不是 init.