Macos 斯威夫特:“我的名字叫什么?”;致命错误:使用未实现的初始值设定项';init()';课堂上……”;
这是一个简单的类,我想用两个数组实例化,以在mac应用程序上填充NSTableView:Macos 斯威夫特:“我的名字叫什么?”;致命错误:使用未实现的初始值设定项';init()';课堂上……”;,macos,cocoa,swift,Macos,Cocoa,Swift,这是一个简单的类,我想用两个数组实例化,以在mac应用程序上填充NSTableView: class TableController: NSObject, NSTableViewDataSource, NSTableViewDelegate { var paintingNames:[String] var paintingKeys:[String] init(names:[String], keys:[String]) { paintingNames
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的数据源)并添加override init()调用来避免此错误:
如果在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(名称:[String],键:[String])
initialiser实例化此类的对象,只需使默认的initialiser抛出一个异常,即
init() {
fatalError("init() has not been implemented")
}
这将防止您犯使用init()
创建对象的错误。另一种方法是将init()
转换为:
override convenience init() {
self.init(names:nil, keys:nil)
}
如果您不知道,
便利性
初始化器允许您从初始化器中调用其他本地初始化器。将数组设置为可选数组之所以有效,是因为可选数组是自动分配的nil
var paintingNames:[String]?
var paintingKeys:[String]?
做的事情和
var paintingNames:[String]? = nil
var paintingKeys:[String]? = nil
实际上,此时可以删除init()
声明,因为默认的初始化器已经为您隐式创建
您没有添加任何代码来显示调用默认初始化器的位置,我希望您没有调用两个
init()
函数。。。这会导致意想不到的结果
如果您只希望使用init(名称:[String],键:[String])
initialiser实例化此类的对象,只需使默认的initialiser抛出一个异常,即
init() {
fatalError("init() has not been implemented")
}
这将防止您犯使用init()
创建对象的错误。另一种方法是将init()
转换为:
override convenience init() {
self.init(names:nil, keys:nil)
}
如果您不知道,
便利性
初始化器允许您从初始化器中调用其他本地初始化器。无检查的意义是什么?再读一遍,这有什么意义吗?我肯定是拿着零支票在抓救命稻草。零支票有什么意义?再读一遍,有什么意义吗?我肯定是在用nil检查来抓救命稻草。“你没有添加任何代码来显示默认初始化器被调用的位置,我希望你没有调用两个init()函数……这会导致意外的结果。”这是我的问题。IB正在调用init(),因为TableController是NSTableView的委托/数据源。这是我的第一个mac应用程序,与UITableView相比,NSTableView有更多的手动设置步骤!“您没有添加任何代码来显示调用默认初始化器的位置,我希望您没有调用两个init()函数……这会导致意外的结果。”这是我的问题。IB正在调用init(),因为TableController是NSTableView的委托/数据源。这是我的第一个mac应用程序,与UITableView相比,NSTableView有更多的手动设置步骤!