我注意到这documentation for NSWindowDelegate条阅读(强调我的):

一组optional个方法,窗口的委托可以实现这些方法来响应事件,如调整窗口大小、移动、显示和最小化.

然而,这documentation for NSApplicationDelegate人是这样写的:

一组方法,用于管理应用的生命周期及其与常见系统服务的交互.

这里没有optional这个词.我发现不包括委托会减少应用程序的可执行文件大小,如果我只使用single window for the entire lifetime of the application,似乎可以替换以下内容:

public func applicationShouldTerminateAfterLastWindowClosed(_ _: NSApplication) -> Bool {
    return true
}

使用以下NSWindowDelegate中的方法:

public func windowWillClose(_ _: Notification) {
    NSApp.stop(nil)
}

行为看起来是一样的,但我在任何地方都找不到任何迹象表明,没有NSApplicationDelegate的手机是苹果官方支持的.这有什么不可预见的后果吗?

推荐答案

虽然这似乎没有explicitly%的记录,但考虑到

  1. NSApplication.delegate被声明为nullable(@property (nullable, weak) id<NSApplicationDelegate> delegate?),因此NSApplication能够没有代表,
  2. 所有NSApplicationDelegate个方法都标记为@optional?,因此委托对象不需要响应任何协议方法,并且
  3. 完全可以通过从一个空的Obj-Cmain.m调用NSApplicationMain(argc, argv)来设置和运行一个应用程序,而不需要任何其他代码/设置

可以很有把握地说,you don't strictly need an app delegate to write an AppKit app--你只是不会以这种方式被告知应用程序生命周期事件.应用程序代理基础设施的存在是为了通知您各种事件,但并不严格依赖于您对它们的响应.


[1]MacOS SDK附带的[2]NSApplication.h不能在网上公开使用,所以我没有可以直接链接到的资源.如果您正在编写MacOS应用程序,您可以通过⌘-单击此文件中的符号(如NSApplicationNSApplicationDelegateNSApplicationMain等)或位于MacOS SDK路径System/Library/Frameworks/AppKit/Versions/Current/Headers/NSApplication.h的磁盘上的符号来查看此文件的内容

Swift相关问答推荐

如何在Swift 中创建移动的uil标签?

Swift C外部实现的Task / Future类类型

在visionOS RealityView中使用.GenerateText时,未显示Reality Composer Promaterial 纹理

在SWIFTUI&39;S视图修改器中使用等待关键字

无法创建MKAssociateRegion对象

SwiftData/PersistentModel.swft:540:致命错误:不支持的关系密钥路径ReferenceWritableKeyPath

SwiftUI:列表背景为空列表时为黑色

PassthroughSubject 的 AsyncPublisher 值属性未生成所有值

如何在 AppDelegate for Cocoa macOS 中创建 mainMenu 和菜单项?

如何在一个视图控制器中创建具有相同行为的多个集合视图?

如何避免从模块导入函数

与 SwiftUI 中的 onChange 修饰符相比,objectWillChangeSequence 的目的是什么?

从 Swift 列表中的行中检索值

为什么swiftui中的导航视图栏那么大?

组合 flatMap 不会返回预期的上下文结果类型

单元测试和私有变量

Swift - 获取本地日期和时间

Swift 中的 PageViewController 当前页面索引

Swift 的 JSONDecoder 在 JSON 字符串中有多种日期格式?

如何在 SwiftUI 中的一个视图上显示两个alert ?