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

时间:2015-01-09 12:35:12

标签: macos swift

这不编译:

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()块。为什么!?!?!

我得到的错误是:

compilation error

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

在文件的某处,它表明你在第一种情况下需要自我:

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]?
}