功能不是放在便利的初始化中吗?在子类中无法使用?
如果是这样,为什么Swift的Cocoa接口定义了这么多的初始化方法以方便使用。
例如-我有一个NSWindowController的子类,我想创建一个指定的init,它将不会获取任何参数,并且应该直接知道要实例化的NIB文件。
但是我无权访问super.init的方法来获得已经实现的行为并在其上进行构建。这是NSWindowController的初始化的定义:
class NSWindowController : NSResponder, NSCoding, NSSeguePerforming, NSObjectProtocol {
init(window: NSWindow?)
init?(coder: NSCoder)
convenience init(windowNibName: String)
convenience init(windowNibName: String, owner: AnyObject)
convenience init(windowNibPath: String, owner: AnyObject)
// ...
}
相反,我被迫重新实现NIB加载,从而导致重复并可能出错。
编辑:
这是Mike Ash的blogpost的一小段内容,提到了NSWindowController子类,而在我的情况下我所做的工作背后的原因是完全相同的:
NSWindowController提供了一个initWithWindowNibName:方法。但是,您的子类仅可用于单个笔尖,因此让客户指定该笔尖名称毫无意义。相反,我们将提供一个简单的init方法,在内部执行正确的操作。只需重写它即可调用super并提供笔尖名称:
- (id)init
{
return [super initWithWindowNibName: @"MAImportantThingWindow"];
}
因此在ObjectiveC中是可能的,但是如何在Swift中完成呢?
最佳答案
便捷初始化器在子类中继承。它们也可以被覆盖。
为了调用init(windowNibName:String),您需要声明一个方便的初始化程序来从中调用它,并且应该在self而不是在super上调用它:
class MAImportantThingWindowController : NSWindowController {
override convenience init() {
self.init(windowNibName: "MAImportantThingWindow")
}
}
关于cocoa - 功能放在方便的初始化中-无法在子类中使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27123293/