You need to enable JavaScript to run this app. 如何在AppDelegate中访问遵循App协议的Swift @main结构体实例
优惠活动
大模型
产品
解决方案
定价
更多

如何在AppDelegate中访问遵循App协议的Swift @main结构体实例

解决方案

你没办法直接获取@main注解自动生成的App结构体实例,SwiftUI的App生命周期下,这个实例由框架内部管理,没有对外暴露公共访问入口。你可以用以下两种常见方案实现需求:

方案1:把SocketServer交由AppDelegate持有(更推荐)

反向调整属性持有逻辑,将SocketServer放到AppDelegate中定义,在App初始化时完成赋值,即可直接在生命周期方法中调用关闭:

  1. 调整AppDelegate代码:
class AppDelegate: NSObject, NSApplicationDelegate {
    var socketServer: SocketServer!

    func applicationWillTerminate(_ notification: Notification) {
        // 主动调用优雅关闭逻辑
        try? socketServer.syncShutdownGracefully()
    }
}
  1. 调整@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 22:45:11