macos - swift : "fatal error: use of unimplemented initializer ' 初始化()' for class..."

标签 macos cocoa swift

这是一个简单的类,我想用两个数组实例化以填充 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/

相关文章:

java - 如何将 Java .jar 编译/打包为 Mac OS X 命令行工具?

objective-c - 在 NSString 的一部分周围绘制方框

cocoa - 读取 Cocoa 中的音频输入电平峰值

ios - 在 Init 中调用函数设置变量

ios - 按下导航栏的编辑按钮时,如何使 TableView Cell 中的 textField 可编辑?

java - Mac 雪豹上的 Intellij 13 无法编译

macos - 苹果机 : Launch command when device connected by bluetooth

objective-c - Objective-C 的正则表达式解决方案

python - 实现 PyObjc NsObject 子类

swift - 安装后ReactiveCocoa出错