Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.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
Swift 重写便利初始化_Swift - Fatal编程技术网

Swift 重写便利初始化

Swift 重写便利初始化,swift,Swift,尝试为NSTextView子类化: class MYTextView : NSTextView { init(frame frameRect: NSRect) { super.init(frame: frameRect) setup() } } 我得到这个错误:必须在这一行上调用超类“NSTextView”的指定初始值设定项:super.init(frame:frameRect) 根据文档的规定,方便的初始值设定项必须调用同一类中可用的另一个初始

尝试为NSTextView子类化:

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")
}