Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 斯威夫特:“我的名字叫什么?”;致命错误:使用未实现的初始值设定项';init()';课堂上……”;_Macos_Cocoa_Swift - Fatal编程技术网

Macos 斯威夫特:“我的名字叫什么?”;致命错误:使用未实现的初始值设定项';init()';课堂上……”;

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

这是一个简单的类,我想用两个数组实例化,以在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的数据源)并添加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有更多的手动设置步骤!