Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift NSWindowController指定的初始值设定项_Swift_Macos_Cocoa - Fatal编程技术网

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手册中初始化章节的一节。如果子类没有声明自己的指定初始值设定项,它将继承其超类的方便初始值设定项。您的问题更多的是,您的初始值设定项不能是一个方便的初始值设定项,因为您的
东西
属性需要初始化。