You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xcode 26 Beta3中如何向sheet(item:)传入返回some View的函数?

Swift 6(Xcode 26 Beta3)中sheet(item:onDismiss:content:)函数参数的并发警告问题

我使用sheet(item:onDismiss:content:)修饰符展示弹窗,弹窗内容由传入的item参数决定,通过接收该参数的函数构建内容。

简化示例代码如下:

struct ContentView: View {
    @State private var sheetContent: SheetContent?

    var body: some View {
        HStack(spacing: 30) {
            Button("Foo") { sheetContent = .foo }
            Button("Bar") { sheetContent = .bar }
        }
        .buttonStyle(.bordered)
        .sheet(item: $sheetContent, content: sheetBody) // 👈 问题所在
    }

    private func sheetBody(contentType: SheetContent) -> some View {
        Text("\(contentType)".capitalized)
            .font(.largeTitle)
            .foregroundStyle(.white)
            .frame(maxWidth: .infinity, maxHeight: .infinity)
            .background(contentType == .foo ? .yellow : .orange)
            .onTapGesture { sheetContent = nil }
    }
}

enum SheetContent: Identifiable {
    case foo
    case bar

    var id: SheetContent { self }
}

在Xcode 26.0 Beta3之前,即便开启Swift 6严格并发检查,代码编译也无警告。但在Beta3搭配Swift 6时,sheet修饰符处出现如下警告:

⚠️ 无法将'@MainActor @Sendable (SheetContent) -> some View'转换为'@MainActor (SheetContent) -> some View',因为跨隔离边界要求参数和返回类型符合Sendable协议;未来Swift语言模式下这将成为错误
❕ 类型'some View'不符合Sendable协议

目前已知一种临时解决方案:通过闭包调用sheetBody函数,而非直接传递函数引用:

.sheet(item: $sheetContent) { item in
    sheetBody(contentType: item)
}

但我想知道是否可以通过为函数添加注解的方式避免使用该方案?尝试添加@Sendable注解时,编译器要求函数变为async,不符合sheet修饰符的签名要求。

问题:如何在Xcode 26.0 Beta3中,将函数直接作为参数传入sheet(item:onDismiss:content:)且不触发警告?


更新:Xcode Beta5中该警告已消失,无需额外解决方案。


内容的提问来源于stack exchange,提问作者Benzy Neez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 16:57:18