功能放在一个方便的init - 在子类中无法使用?

时间:2014-11-25 09:43:47

标签: cocoa swift

是否将功能置于便利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中完成呢?

1 个答案:

答案 0 :(得分:1)

便捷初始值设定项在子类中继承。它们也可以被覆盖。

为了调用init(windowNibName:String),你需要声明一个方便的初始化器来调用它,你应该在 self 上调用它,而不是 super

class MAImportantThingWindowController : NSWindowController {

    override convenience init() {
        self.init(windowNibName: "MAImportantThingWindow")
    }
}