这是一个简单的类,我想用两个数组实例化以填充 mac 应用程序上的 NSTableView:
class TableController: NSObject, NSTableViewDataSource, NSTableViewDelegate {
var paintingNames:[String]
var paintingKeys:[String]
init(names:[String], keys:[String]) {
paintingNames = names
paintingKeys = keys
// breakpoint here shows both arrays have values
}
...
}
当我在初始化代码时单步执行代码时,到目前为止一切正常。然后我得到这个错误:
"fatal error: use of unimplemented initializer 'init()' for class..."
所以我可以通过添加数组选项(不是我想要的,因为它们是 tableView 的数据源)并添加覆盖 init() 调用来避免此错误:
class TableController: NSObject, NSTableViewDataSource, NSTableViewDelegate {
var paintingNames:[String]?
var paintingKeys:[String]?
override init() { // this gets called after the first custom init function
// a breakpoint here shows the arrays are now both nil
}
init(names:[String], keys:[String]) { //this gets called first
paintingNames = names
paintingKeys = keys
// breakpoint here shows both arrays have values
}
...
}
如果在 override init() 调用中没有对数组进行 nil 检查,则数组为 nil。即使添加了这一点逻辑:
override init() { // this gets called after the first custom init function
if paintingNames != nil {
paintingNames = [String]()
}
if paintingKeys != nil {
paintingKeys = [String]()
}
}
他们仍然是零。
这是怎么回事?
最佳答案
将数组作为可选值的原因是因为可选值被自动分配为 nil
。
var paintingNames:[String]?
var paintingKeys:[String]?
和
做完全一样的事情var paintingNames:[String]? = nil
var paintingKeys:[String]? = nil
此时您实际上可以删除 init()
声明,因为您的默认初始化程序已经为您隐式创建。
您还没有添加任何代码来显示调用默认初始化程序的位置,我希望您没有调用两个 init()
函数……这是导致意外结果的秘诀。
如果您只想使用 init(names:[String], keys:[String])
初始化器实例化此类的对象,只需让您的默认初始化器抛出异常即可,即,
init() {
fatalError("init() has not been implemented")
}
这将防止您犯下使用 init()
创建对象的错误。另一种方法是让你的 init()
变成:
override convenience init() {
self.init(names:nil, keys:nil)
}
如果您不知道,便利
初始化器允许您从一个初始化器中调用其他本地初始化器。
关于macos - swift : "fatal error: use of unimplemented initializer ' 初始化()' for class...",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26836915/