功能不是放在便利的初始化中吗?在子类中无法使用?

如果是这样,为什么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/

10-15 07:25