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

