gpt4 book ai didi

swift - 为什么我可以为 NSWindowController 的子类调用一个无参数的 init()?

转载 作者:行者123 更新时间:2023-11-28 13:10:27 26 4
gpt4 key购买 nike

代码如下:

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."

我认为我知道的事情:

  1. MainWindowController 未提供无参数默认 init(),因为 MainWindowController 声明的属性没有默认值。

  2. NSWindowController 没有无参数的 init()。

  3. NSObject 确实有一个没有参数的 init()。

MainWindowController 中重写的指定初始化器 init(window: NSWindow?) 是如何被调用的?

@阿库,

需要说明的是,NSWindowController 的便利 init() 必须像这样实现:

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

仅仅从 NSObject 继承 init() 不会做到这一点。

最佳答案

由于您正在为父类(super class) NSWindowController 的所有指定初始化器提供实现,因此您也会自动继承便利初始化器。似乎 no-arg init() 是这些便利初始化程序之一,调用 init(window:)nil窗口

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

关于swift - 为什么我可以为 NSWindowController 的子类调用一个无参数的 init()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31528595/

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