Xcode 可故障och非可故障初始化器阻止我扩展NSView和实现NSCoding
我在实现实现Xcode 可故障och非可故障初始化器阻止我扩展NSView和实现NSCoding,xcode,macos,cocoa,swift,nscoding,Xcode,Macos,Cocoa,Swift,Nscoding,我在实现实现NSCoding的子类到NSView时遇到问题 似乎init(coder:NSCoder)的声明在NSView和NSCoding中存在冲突。 NSView现在说它是可故障的,但是NSCoding仍然说它是不可故障的 当我试图覆盖init(coder:NSCoder)并进行自定义初始化时,Xcode 6.1会给我一条错误消息: 非故障初始值设定项不能链接到故障初始值设定项 “init(编码者:)”是用“init”写的吗 我应该如何进行我的类的自定义初始化 下面是一个愚蠢的例子,我扩展了
NSCoding
的子类到NSView
时遇到问题
似乎init(coder:NSCoder)
的声明在NSView
和NSCoding
中存在冲突。
NSView
现在说它是可故障的,但是NSCoding
仍然说它是不可故障的
当我试图覆盖init(coder:NSCoder)
并进行自定义初始化时,Xcode 6.1会给我一条错误消息:
非故障初始值设定项不能链接到故障初始值设定项
“init(编码者:)”是用“init”写的吗
我应该如何进行我的类的自定义初始化
下面是一个愚蠢的例子,我扩展了一个视图,我想为我的视图保留一个额外的点击计数器
import Cocoa
import Foundation
class MyView: NSView, NSCoding {
var clickCounter:Int = 0
required init(coder: NSCoder) {
super.init(coder: coder)
coder.encodeObject(self.clickCounter,
forKey: "clickCounter")
}
override func encodeWithCoder(coder: NSCoder) {
super.encodeWithCoder(coder)
coder.encodeObject(self.clickCounter, forKey: "clickCounter")
}
override func mouseDown(theEvent: NSEvent) {
clickCounter++
}
}
您不必明确遵守
NSCoding
,因为nsrresponder
(NSView的超类NSView
)已经遵守了它
required init?(coder: NSCoder) {
super.init(coder: coder)
self.clickCounter = coder.decodeObjectForKey("clickCounter") as Int
}
这使编译器感到满意,但(对我来说)似乎很奇怪:
NSCoding
需要init(coder-aDecoder:NSCoder)
,即不可失败的初始值设定项,但NSResponder
,NSView
等实现init?(coder:NSCoder)
也许导入的标题中有错误?是的,我想是的-/谢谢因此,为了总结解决方案,我删除了与NSCoding的显式一致性,并添加了?我的初衷是使它不可能失败。但仍然很奇怪,我想知道NSResponder是如何通过在其failable init中进行NSCoding来实现所需的非failable init的。还是我错过了一些明显的东西?老兄,你帮了我很多挫折。论坛和文档中的所有废话都没有真正指出这一点。非常感谢。