当前位置: 首页 > 面试题库 >

在Swift和init中子类化NSWindowController(windowNibName)

羊舌自强
2023-03-14
问题内容

我正在尝试在Swift中启动一个新的基于文档的Cocoa项目,并想创建一个子类NSWindowController(如在基于文档的应用程序的Apple指南中所建议的那样)。在ObjC中,您将创建一个NSWindowController子类的实例来发送initWithWindowNibName:html" target="_blank">消息,并通过调用superclasses方法相应地实现了该消息。

在斯威夫特init(windowNibName)仅作为一种方便的初始化,指定初始化的NSWindowController就是init(window)这显然想让我在一个窗口中通过。

我不能super.init(windowNibName)从我的子类中调用,因为它不是指定的初始化器,所以显然我必须实现convenience init(windowNibName),而后者又需要调用self.init(window)。但是,如果我只有nib文件,该如何访问nib文件的窗口以发送给该初始化程序?


问题答案:

您需要覆盖NSWindowControllerinit()init(window)init(coder))的所有三个指定的初始化器,或者都不重写它们,在这种情况下,您的子类将自动继承,init(windowNibName)而所有其他便捷的初始化器都将覆盖,您将能够使用超类的便捷的初始化器来构造它:

// this overrides none of designated initializers
class MyWindowController: NSWindowController {
    override func windowDidLoad() {
        super.windowDidLoad()
    }
}

// this one overrides all of them
//
// Awkwardly enough, I see only two initializers 
// when viewing `NSWindowController` source from Xcode, 
// but I have to also override `init()` to make these rules apply.
// Seems like a bug.
class MyWindowController: NSWindowController
{
    init()
    {
        super.init()
    }

    init(window: NSWindow!)
    {
        super.init(window: window)
    }

    init(coder: NSCoder!)
    {
        super.init(coder: coder)
    }

    override func windowDidLoad() {
        super.windowDidLoad()
    }
}

// this will work with either of the above
let mwc: MyWindowController! = MyWindowController(windowNibName: "MyWindow")

语言指南中的“初始化/自动初始化继承”对此进行了介绍:

但是,如果满足某些条件,则会自动继承超类初始化器。实际上,这意味着您不需要在许多常见情况下编写初始化程序覆盖,并且可以在安全的情况下以最小的努力继承超类初始化程序。

假设为子类中引入的任何新属性提供默认值,则适用以下两个规则:

规则1 如果子类没有定义任何指定的初始化器,它将自动继承其所有超类指定的初始化器。

规则2
如果您的子类提供了其所有超类指定的初始值设定项的实现(通过按规则1继承它们,或通过提供自定义实现作为其定义的一部分),则它会自动继承所有超类的便利初始值设定项。



 类似资料:
  • 问题内容: 我正在跟踪Swift和Objective-C Runtime,它适用于常规方法。 我喜欢使用init方法,据我了解,init就像一个类方法。因此,我尝试将初始化作为实例和类方法。但这似乎不起作用 我可以使用Objective C使其工作,只是想知道如何在Swift中使其工作 摘录自我的要旨 问题答案: 为方法创建选择器时,应使用Obj C方法签名作为选择器的基础,因为使用Obj C运行

  • 问题内容: 作为学习练习,我尝试实现一个子类,该子类提供一个新的便捷初始化器,该初始化器采用一个数字并构造一个ShapeNode,该ShapeNode是一个数字宽度和高度的平方。 根据《雨燕书》: 规则1 如果您的子类没有定义任何指定的初始化器,它将自动继承其所有超类的指定初始化器。 规则二 如果您的子类提供了其所有超类指定初始化器的实现(通过按照规则1继承它们,或通过提供自定义实现作为其定义的一

  • 问题内容: 这是一个双重问题,其中包括理论部分和实际问题: 当将dict归类时: 应该被称为“安全”措施(例如,万一有一些重要的实施细节很重要)?有一个风险,即与Python的未来版本的代码休息,如果是 不 叫?我在这里寻找做一件事情或另一件事情的根本原因(实际上,打电话是安全的)。 我的猜测是,当被调用时,self已经是一个新的空dict对象,因此不需要调用(我确实希望dict首先是空的)。这个

  • 问题内容: 我想在Swift中编写一个方法。在这里,我在Objective-C中初始化一个类: 如何在Swift中编写此方法? 问题答案: 我想这可能是您上课的良好基础 我想避免将键复制粘贴到项目中,因此我将可能的键放入这样的示例中: 并且您可以像这样改进您的方法,并且将来您可以避免代码中任何可能的键错误: 注意:那只是如何做的一个原始想法,根本不需要使用便捷的初始化程序,但是对于我对您的最终课程

  • 问题内容: 我想子类化并显示类似视图的登录名。我已经在Objective- C中创建了它,但是现在我想将其移植到Swift。我不使用情节提要,所以我用代码创建了所有UI。 但是第一个问题是我必须执行。我给了它一个默认的实现,因为它不会被调用。现在,当我运行程序时,它崩溃了,因为我也必须实现。现在我得到了: 我的问题是我应该在哪里创建文本字段等…,如果我从不实现框架和编码器,该如何“隐藏”呢? 问题

  • 问题内容: 考虑两个类。第一个是,其子类符合: 第二类继承自: 该代码无法编译,因为: 使用元类型值构造“ Vehicle”类类型的对象必须使用“ required”初始化程序。 因此,我继续添加所需的初始化程序: 现在,应用程序可以编译,并且对象可以正确响应。 两个问题: 为什么构造具有元类型的对象需要初始化程序?(看来我编写的初始化程序没有任何作用。) 我写错了什么,还是 应该 添加到初始化程