ios 如何修复不支持并发的自动闭包中的“'async'调用”?

bmp9r5qi  于 2022-11-19  发布在  iOS
关注(0)|答案(1)|浏览(185)

我 有 两 个 函数 ( 编译 时 没有 错误 ) :

func hasLocalChanges() -> Bool {
    return false
}

func hasRemoteChanges() async -> Bool {
    return await Task{ true }.value
}

中 的 每 一 个
现在 , 假设 我 想 引入 第 三 个 函数 , 它 看 起来 像 这样 :

func hasChanges() async -> Bool {
    return self.hasLocalChanges() || await self.hasRemoteChanges()
}

格式
然后 这个 函数 会 给 我 一 个 编译 器 错误 , 说 :

'async' call in an autoclosure that does not support concurrency

格式
但 为什么 呢 ?
我 可以 通过 交换 操作 数 来 解决 错误 ...

func hasChanges() async -> Bool {
    return await self.hasRemoteChanges() || self.hasLocalChanges()
}

格式
... , 这 同样 会 使 代码 编译 时 没有 错误 。
但是 我 真 的 想 利用 惰性 求值 , 最 后 执行 异步 函数 。 所以 实现 这 一 点 的 唯一 方法 是 ...

func hasChanges() async -> Bool {
    if !self.hasLocalChanges() {
        return await self.hasRemoteChanges()
    } else {
        return true
    }
}

格式
... ... , 这 似乎 有点 麻烦 。
有 谁 能 解释 一下 为什么 我 一 开始 就 得到 这个 错误 吗 ?

xesrikrc

xesrikrc1#

这是因为||实际上是一个函数,它希望右边看起来像rhs: @autoclosure () throws -> Bool(例如rhs: @autoclosure () async throws -> Bool
请在此处查看源代码:https://github.com/apple/swift/blob/e6cbf5483237aa593bdbafb6c7db7ebcb2d0e26a/stdlib/public/core/Bool.swift#L320
当您首先移动await时,它将解析为布尔值,然后self.hasLocalChanges()是非异步() throws -> Bool
下面编译的示例
第一个

相关问题