cocoa - 功能放在方便的 init 中 - 在子类中不可用?

标签 cocoa swift

功能不是放在一个方便的 init 中 - 在子类中不可用吗?

如果是这样,为什么 Cocoa 的 Swift 接口(interface)为了方便而定义了这么多初始化器。

例如 - 我有一个 NSWindowController 的子类,我想创建一个指定的 init,它不会获取任何参数,并且应该直接知道要实例化的 NIB 文件。

但我无法访问 super.init 的/方法来获取已实现的行为并在此基础上进行构建。这是 NSWindowController 的 inits 的定义:

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 加载,从而重复并可能出错。

编辑:

这是来自 blogpost 的一小段文字作者:Mike Ash,提到 NSWindowController 子类,并且我在我的例子中所做的背后的推理是完全相同的:

NSWindowController 提供了一个 initWithWindowNibName: 方法。但是,您的子类仅适用于单个 Nib ,因此让客户端指定该 Nib 名称是毫无意义的。相反,我们将提供一个简单的 init 方法,在内部执行正确的操作。只需覆盖它即可调用 super 并提供 Nib 名称:

- (id)init
{
    return [super initWithWindowNibName: @"MAImportantThingWindow"];
}

所以这在 ObjectiveC 中是可能的,但是在 Swift 中如何实现呢?

最佳答案

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

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

class MAImportantThingWindowController : NSWindowController {

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

关于cocoa - 功能放在方便的 init 中 - 在子类中不可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27123293/

相关文章:

ios - NSOutputStream outputStreamToFileAtPath :path append:NO has no space available

ios - 如果 TableViewCell 有大量数据要显示,则在 UITableViewCell 中添加自定义按钮的最佳方式。使用 swift

swift - 分段控件返回错误值?

objective-c - 如何以编程方式向 OS X 应用程序添加红绿灯按钮

objective-c - 在不同版本的 OSX 上调试 XCode 之外的应用程序(查看异常、日志等)

objective-c - NSObject 类现在是 Objective-C 运行时库的一部分(而不是 Foundation 组件)吗?

cocoa - 运行 NSRunLoop 导致主线程挂起

ios - 从 Objective-C NSArray 转换为 swift [[String :String]]?

ios - 如何在 swift 5 中显示模态屏幕?

ios - 显示当前时间