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
相关产品推荐
相关产品推荐

