gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:20:14 24 4
gpt4 key购买 nike

功能不是放在一个方便的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com