Xcode报错:Cannot pass function of type ‘@Sendable () async -> ()’ to parameter expecting synchronous function type
Xcode报错:Cannot pass function of type ‘@Sendable () async -> ()’ to parameter expecting synchronous function type

Xcode报错:Cannot pass function of type ‘@Sendable () async -> ()’ to parameter expecting synchronous function type

Swift如果把异步代码写入MainActor.run {} 同步闭包,就会报错:

Cannot pass function of type '@Sendable () async -> ()' to parameter expecting synchronous function type

例如:

Task {
    let success = FileUtils.cleanTempFolder()
    // MainActor是同步函数
    await MainActor.run {
        if success {
            cleanStatus = .success
        } else {
            cleanStatus = .error
            // 同步函数调用异步函数
            try? await Task.sleep(for: .seconds(1))
            cleanStatus = .clean
        }
    }
}

解决方案:将异步函数移除MainActor.run同步闭包。

Button(action: {
    if cleanStatus == .clean {
        cleanStatus = .loading

        Task {
            let success = FileUtils.cleanTempFolder()

            // 1. 更新 UI(主线程)
            await MainActor.run {
                cleanStatus = success ? .success : .error
            }

            // 2. 如失败,延迟恢复状态(后台等待 + 主线程更新)
            if !success {
                try? await Task.sleep(nanoseconds: 1_000_000_000)

                await MainActor.run {
                    cleanStatus = .clean
                }
            }
        }
    }
})
   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注