big*_*row 2 initialization designated-initializer convenience-methods swift
我有一个子类NSTextView
,在这个子类的初始化器中,我想调用:
super.init(frame: NSMakeRect(...))
Run Code Online (Sandbox Code Playgroud)
这就是我在以NSTextView
编程方式初始化时总是做的事情。我简单地写:
let textView = NSTextView(frame: NSMakeRect(0,0,10,10))
Run Code Online (Sandbox Code Playgroud)
但是,当我在子类 ( super.init(frame: (...))
) 中执行此操作时,编译器会抛出错误。它不会让我使用,init(frame:)
因为它init(frame:)
是 的便利初始化程序NSTextView
,我必须调用“超类的指定初始化程序”。
查了文档,发现是的指定构造器NSTextView
是init(frame: textContainer:)
但是我不想处理NSTextContainers
. 为什么我必须从对象的子类调用指定的初始化程序,但如果对象没有被子类化,我可以调用便利初始化程序?每当我通常初始化 anNSTextView
我不必提供 an NSTextContainer
,但是当我将 an 初始化NSTextView
为子类的超类时,我会这样做。为什么是这样?
另外,有没有办法NSTextView
用一种“默认”文本容器来初始化?不管指定的初始值设定项如何,我在这里要做的就是创建一个NSTextView
不用担心NSTextContainers
.
我为此找到了一个工作。它不漂亮,但它完成了工作。基本上我只是NSTextView
在我的子类初始值设定项内部创建一个实例,init(frame:)
然后将结果textContainer
应用于super
:
class Header: NSTextView {
// methods and properties...
init(frame theFrame: NSRect) {
// using desired convenience initializer
let test = NSTextView(frame: theFrame)
// using designated initializer, as required by the compiler
super.init(frame: test.frame, textContainer: test.textContainer)
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
992 次 |
最近记录: |