为什么在 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.
这不编译:
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.