Swift 为什么我可以为NSWindowController的子类调用no arg init()?

Swift 为什么我可以为NSWindowController的子类调用no arg init()?,swift,cocoa,xcode6,Swift,Cocoa,Xcode6,代码如下: import Cocoa class MyWindowController: NSWindowController { var name: String override init(window: NSWindow?) { name = "Sue" super.init(window: window) } required init?(coder: NSCoder) { name = "Dave"

代码如下:

import Cocoa

class MyWindowController: NSWindowController {

    var name: String

    override init(window: NSWindow?) {
        name = "Sue"
        super.init(window: window)
    }

    required init?(coder: NSCoder) {
        name = "Dave"
        super.init(coder: coder)
    }
}

let controller = MyWindowController()
println("A boy named \(controller.name).")  //=> "A boy named Sue."
我想我知道的事情:

  • MainWindowController未提供no arg default init(),因为MainWindowController声明的属性没有默认值

  • NSWindowController没有no arg init()

  • NSObject确实有一个no arg init()

  • 如何调用MainWindowController中被重写的指定初始值设定项
    init(window:NSWindow?

    @阿尔库

    需要明确的是,NSWindowController的便利性init()必须如下实现:

    override convenience init() {
        self.init(window: nil)
    }
    

    仅仅从NSObject继承init()是不行的。

    因为您为超类的所有指定初始值设定项
    NSWindowController
    提供了实现,所以您也会自动继承方便的初始值设定项。no arg
    init()
    似乎是这些方便的初始值设定项之一,它使用
    nil
    调用
    窗口的
    init(窗口:)


    为了澄清,假设#2(即
    NSWindowController
    没有
    init()
    )是错误的;它确实有这样一个
    init
    (只是当前未在类文档中列出)。它是一个Objective-C类,Swift初始值设定项的规则不适用于该类,但当从Swift方面进行子类化时,重要的是该方法是否存在(它存在)以及它是否标记为指定的初始值设定项(它不存在)。

    我是这么认为的,但是文档中没有在NSWindowController中列出no arg init()。我还检查了.h文件…没有arg init()。
    NSWindowController
    NSObject
    的子类,它具有
    init()
    。Cocoa文档不会将每个超类的方法复制到每个类的文档中。@RobNapier:是的,请参见#3。如何从NSObject的init()到重写的
    init(window:NSWindow?
    ?@7stud即使
    NSWindowController
    的文档没有明确列出
    init()
    ,您也可以使用
    NSWindowController()
    创建一个实例。之所以没有如此清晰地记录下来,部分原因可能是因为该方法的Objective-C根。@Arkku,它并没有那么简单。NSWindowController必须重写NSObjects init(),以便调用NSWindowController中指定的初始值设定项,即
    init(window:NSWindow?
    ),因此,NSWindowController文档或源代码必须列出重写的init()。