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

如何正确向SwiftUI子视图传递带参数的异步函数?

解决SwiftUI中传递带参数异步函数到子视图的问题

你的错误出在SubView中对函数属性的声明语法上,Swift里不能直接用let saveIdsWatchedTime(memetime: Int) -> Void这种方式定义函数类型的属性,需要用异步闭包类型来声明。

修正后的完整代码

struct ContentView: View {
    
    func saveIdsWatchedTime(memetime: Int) async {
        print("result:")
        print(memetime)
    }
    
    var body: some View {
        VStack{
            // 直接传递函数引用即可,Swift会自动推断类型
            SubView(saveIdsWatchedTime: saveIdsWatchedTime)
        }
    }
}

struct SubView: View {
    // 正确声明带参数标签的异步闭包类型
    let saveIdsWatchedTime: (_ memetime: Int) async -> Void
    
    var body: some View {
        Text("bla")
            .onTapGesture {
                Task(priority: .background) {
                    // 调用异步函数时必须使用await
                    await saveIdsWatchedTime(123)
                }
            }
    }
}

关键说明

  • 子视图中必须用闭包类型语法定义属性:(_ memetime: Int) async -> Void,其中async标记这是一个异步闭包,参数标签memetime通过_ memetime保留(如果不需要参数标签,可以简化为(Int) async -> Void)。
  • 调用异步闭包时,必须在Task内部使用await关键字,这是Swift异步编程的要求。
  • 父视图传递函数引用时,直接写函数名saveIdsWatchedTime即可,Swift会自动完成类型匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:01:08