Swift 重写便利初始化
尝试为NSTextView子类化:Swift 重写便利初始化,swift,Swift,尝试为NSTextView子类化: class MYTextView : NSTextView { init(frame frameRect: NSRect) { super.init(frame: frameRect) setup() } } 我得到这个错误:必须在这一行上调用超类“NSTextView”的指定初始值设定项:super.init(frame:frameRect) 根据文档的规定,方便的初始值设定项必须调用同一类中可用的另一个初始
class MYTextView : NSTextView {
init(frame frameRect: NSRect) {
super.init(frame: frameRect)
setup()
}
}
我得到这个错误:必须在这一行上调用超类“NSTextView”的指定初始值设定项:super.init(frame:frameRect)
根据文档的规定,方便的初始值设定项必须调用同一类中可用的另一个初始值设定项。
。请参阅下面的“初始值设定项链接”:
但是对于nstextview,我得到的唯一指定init是super.init(frame:,textContainer:)
&super.init(coder:coder)
&super.inti()
init(frame:)
做了一些我不想自己实现的设置
有什么方法可以使用超级类的方便初始化器吗?重写指定的初始化器:
class MyTextView : NSTextView {
init(frame frameRect: NSRect, textContainer aTextContainer: NSTextContainer!) {
super.init(frame: frameRect, textContainer: aTextContainer)
setup();
}
func setup() {
...
}
}
var textView = MyTextView(frame: NSRect())
由于所有指定的初始值设定项都被覆盖,所有便利性都将自动继承
还有两个指定的初始值设定项要覆盖:
init() {
}
及
我也被这个问题绊倒了。我仍然在使用继承技巧快速初始化,所以很可能我不理解这里的其他内容
公认的答案似乎建议重写init(frame:textContainer:)
、init
、和init(coder:)
将使init(frame:)
可访问,但对我来说不是
我能让事情按我所希望的那样运行的唯一方法是:
override init(frame frameRect: NSRect, textContainer container: NSTextContainer?) {
super.init(frame: frameRect, textContainer: container)
setup()
}
override init(frame frameRect: NSRect) {
// this will end up calling init(frame:textContainer:)
super.init(frame: frameRect)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
NSTextView实际上有init()
和init(coder:)
,需要重写它们才能继承便利init。@AlexMarchant更新了答案。@AlexMarchant必须查找它init(coder:)
不是指定的,它实际上来自一个协议(NSCoding
)。我想这仍然很重要,在操场上试试这些。使用init(frame:,textContainer:)
时出现错误。加载项init()
仍然错误。但这三种方法都有效。
override init(frame frameRect: NSRect, textContainer container: NSTextContainer?) {
super.init(frame: frameRect, textContainer: container)
setup()
}
override init(frame frameRect: NSRect) {
// this will end up calling init(frame:textContainer:)
super.init(frame: frameRect)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}