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."
我想我知道的事情:
init(window:NSWindow?
@阿尔库
需要明确的是,NSWindowController的便利性init()必须如下实现:
override convenience init() {
self.init(window: nil)
}
仅仅从NSObject继承init()是不行的。因为您为超类的所有指定初始值设定项
NSWindowController
提供了实现,所以您也会自动继承方便的初始值设定项。no arginit()
似乎是这些方便的初始值设定项之一,它使用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()。