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

Swift中如何在onSubmit块内调用await异步函数?同步类型参数报错如何解决?

报错原因

"Cannot pass function of type '() async -> ()' to parameter expecting synchronous function type"
该报错触发自你代码中的.onSubmit(of: .search)修饰符:SwiftUI的onSubmit闭包默认是同步类型,不支持直接在内部使用await调用异步方法。你代码中用到的.refreshable、.task修饰符本身原生支持异步闭包参数,所以这两处的await调用不会触发报错。

修复方案

在onSubmit的闭包内部使用Task包裹异步调用代码即可,Task会自动调度异步任务执行:

// 修改后的onSubmit代码
.onSubmit(of: .search) {
    Task {
        await twitterAPI.executeQuery(userName: searchText)
    }
}

修改后完整代码如下:

struct ContentView: View {

    @ObservedObject var twitterAPI: TwitterAPI = TwitterAPI()

    @State private var searchText = "TheEllenShow" // TheEllenShow

    var body: some View {
        NavigationView {
            VStack{
                if twitterAPI.twitterSearchResults?.resultDataVM != nil{
                    List {
                        ForEach((twitterAPI.twitterSearchResults?.resultDataVM)!) { item in
                            Text(item.text)
                        }
                    }
                    .refreshable {
                        await twitterAPI.executeQuery(userName: searchText)
                    }
                }else{
                    Text("Loading")
                }
                Spacer()
            }
            .searchable(text: $searchText)
            .onSubmit(of: .search) {
                Task {
                    await twitterAPI.executeQuery(userName: searchText)
                }
            }
            .navigationTitle("Twitter")
        }
        .task {
            await twitterAPI.executeQuery(userName: searchText)
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:06:05