如何在AppDelegate中访问遵循App协议的Swift @main结构体实例
解决方案
你没办法直接获取@main注解自动生成的App结构体实例,SwiftUI的App生命周期下,这个实例由框架内部管理,没有对外暴露公共访问入口。你可以用以下两种常见方案实现需求:
方案1:把SocketServer交由AppDelegate持有(更推荐)
反向调整属性持有逻辑,将SocketServer放到AppDelegate中定义,在App初始化时完成赋值,即可直接在生命周期方法中调用关闭:
- 调整AppDelegate代码:
class AppDelegate: NSObject, NSApplicationDelegate { var socketServer: SocketServer! func applicationWillTerminate(_ notification: Notification) { // 主动调用优雅关闭逻辑 try? socketServer.syncShutdownGracefully() } }
- 调整@main结构体的代码:
@main struct RelayEmulatorApp: App { @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate init() { // 初始化SocketServer并赋值给AppDelegate属性 appDelegate.socketServer = SocketServer() } }
原有其他地方需要访问SocketServer的逻辑,也可以通过@NSApplicationDelegateAdaptor拿到AppDelegate后取对应属性即可。
方案2:使用全局单例管理SocketServer
如果你的SocketServer需要在项目多处频繁调用,可以用全局单例统一管理实例,App和AppDelegate都直接访问单例即可:
// 全局单例定义 enum SocketServerManager { static let shared = SocketServer() }
AppDelegate中关闭逻辑直接调用:
func applicationWillTerminate(_ notification: Notification) { try? SocketServerManager.shared.syncShutdownGracefully() }
内容的提问来源于stack exchange,提问作者Scott
相关产品推荐
相关产品推荐

