覆盖便利init

时间:2014-06-12 19:17:05

标签: swift

尝试子类化NSTextView:

class MYTextView : NSTextView {
    init(frame frameRect: NSRect) {
        super.init(frame: frameRect)
        setup()
    }
}

我收到此错误:Must call a designated initializer of the superclass 'NSTextView'在此行:super.init(frame: frameRect)

根据文档Convenience initializers must call another initializer available in the same class.。请参阅'初始化程序链接'下面: https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/Initialization.html#//apple_ref/doc/uid/TP40014097-CH18-XID_286

但对于NSTextViews,我得到的唯一指定内容是super.init(frame:, textContainer:)& super.init(coder: coder)& super.inti()init(frame:)做了一些我不愿意自己实施的设置。

有没有办法使用超级的便利初始化器?

2 个答案:

答案 0 :(得分:5)

覆盖指定的初始化程序:

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(coder:) {
}

答案 1 :(得分:0)

我刚被这个确切的问题绊倒了。我仍然使用继承棘手的Swift初始化,所以我绝对不可能在这里理解别的东西。

接受的答案似乎表明覆盖init(frame: textContainer:)initinit(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")
}