【发布时间】:2016-01-05 16:46:20
【问题描述】:
我有一个NSTextView 的子类,我想在这个子类的初始化程序中调用:
super.init(frame: NSMakeRect(...))
这是我在以编程方式初始化NSTextView 时经常做的事情。我只是写:
let textView = NSTextView(frame: NSMakeRect(0,0,10,10))
但是,当我在子类 (super.init(frame: (...))) 中执行此操作时,编译器会引发错误。它不允许我使用init(frame:),因为init(frame:) 是NSTextView 的便利初始化程序,我必须调用“超类的指定初始化程序”。
查看文档后发现NSTextView的指定初始化器是init(frame: textContainer:),但我不想处理NSTextContainers。为什么我必须从对象的子类调用指定的初始化程序,但如果对象没有被子类化,我可以调用便利初始化程序?每当我通常初始化NSTextView 时,我不必提供NSTextContainer,但是当我将NSTextView 初始化为子类的超类时,我会提供。这是为什么呢?
另外,有没有办法用一种“默认”文本容器初始化NSTextView?不管指定的初始化器是什么,我在这里要做的就是创建一个NSTextView,而不用担心NSTextContainers。
【问题讨论】:
-
我刚刚遇到了一个非常相似的问题。查看stackoverflow.com/a/44025300/288405。
标签: swift initialization designated-initializer convenience-methods