Swift NSWindowController指定的初始值设定项
我正在努力使此代码正常工作:Swift NSWindowController指定的初始值设定项,swift,macos,cocoa,Swift,Macos,Cocoa,我正在努力使此代码正常工作: class MyWindowController: NSWindowController { let thing: Thing convenience init(thing: Thing) { self.thing = thing super.init(windowNibName: NSNib.Name(rawValue: "MyNib")) } } 当然,问题是方便的初始值设定项不能从超类调用init。那么,我如何初始化我的东
class MyWindowController: NSWindowController
{
let thing: Thing
convenience init(thing: Thing)
{
self.thing = thing
super.init(windowNibName: NSNib.Name(rawValue: "MyNib"))
}
}
当然,问题是方便的初始值设定项不能从超类调用
init
。那么,我如何初始化我的东西
,并且仍然能够调用init(windowNibName:)
,它本身就是一个方便的初始化器?我不想自己重新实现nib加载,但是如果我只能使用指定的初始值设定项,如何避免它呢?根据NSWindowController
文档:
您还可以实现一个NSWindowController
子类,以避免在实例化窗口控制器时要求客户端代码获取相应的nib文件名并将其传递给init(windowNibName:)
或init(windowNibName:owner:)
。最好的方法是重写windowNibName
以返回nib的文件名,并通过将nil
传递到init(window:)
来实例化窗口控制器。使用init(window:)指定的初始值设定项简化了对Swift初始值设定项要求的遵从性
您可以将类实现为:
class MyWindowController: NSWindowController
{
let thing: Thing
override var windowNibName: NSNib.Name? {
return NSNib.Name(rawValue: "MyNib")
}
init(thing: Thing) {
self.thing = thing
super.init(window: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
谢谢,我忘记了
windowNibName
。这个问题有更普遍的解决办法吗?或者它总是需要这样的解决方法?到底什么是“这个问题”?您的意思是使用super.init…
时需要调用指定的初始值设定项吗?这完全取决于所涉及的类。如果我在另一个类中遇到了类似的情况,但没有与之相当的windowNibName
?这似乎是一种解决方法,可以避免无法从子类调用方便的初始值设定项。我不明白这个限制的目的。每一个案例都需要以对所涉及的班级有意义的方式来处理。请参阅Swift手册中初始化章节的一节。如果子类没有声明自己的指定初始值设定项,它将继承其超类的方便初始值设定项。您的问题更多的是,您的初始值设定项不能是一个方便的初始值设定项,因为您的东西
属性需要初始化。