这不编译:
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()
块。为什么!?!?!
我得到的错误是:
......这对我来说似乎是假的。
答案 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]?
}