是否将功能置于便利init中 - 在子类中无法使用?
如果是这样,为什么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:方法。但是,您的子类只能使用一个nib,因此让客户端指定该nib名称毫无意义。相反,我们将提供一个普通的init方法,在内部做正确的事情。只需覆盖它以调用super并提供nib名称:
- (id)init
{
return [super initWithWindowNibName: @"MAImportantThingWindow"];
}
所以在ObjectiveC中这是可能的,但是如何在Swift中完成呢?
答案 0 :(得分:1)
便捷初始值设定项在子类中继承。它们也可以被覆盖。
为了调用init(windowNibName:String),你需要声明一个方便的初始化器来调用它,你应该在 self 上调用它,而不是 super :
class MAImportantThingWindowController : NSWindowController {
override convenience init() {
self.init(windowNibName: "MAImportantThingWindow")
}
}