gpt4 book ai didi

Swift 5.5 异步操作作为 optional 默认值

转载 作者:行者123 更新时间:2023-12-04 12:28:27 24 4
gpt4 key购买 nike

我有一个 async返回 optional String 的函数.

func traverse(file:URL, for string:String) async throws -> String? {
...
}
我想运行这个函数,如果 nil ,使用不同的参数运行它,如下所示:
async let langRes = try traverse(file: languageFile, for: string)
async let engRes = try traverse(file: englishFile, for: string)
let result = try await langRes ?? engRes
但 optional 默认 engRes给出错误:

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


像这样的工作正常:
let result = try await langRes ?? ""
它只是不喜欢使用 async默认/后备功能。
我知道我可以这样做:
var result = try await langRes
if result == nil {
result = try await engRes
}
但最好使用 optional 链接回退 ??我的语法错误还是它不起作用?

最佳答案

你是完全正确的:你不能使用 ??你想要的方式。第二个成员(在 ?? 之后)确实是一个自动关闭,因此除非必须,否则不会对其进行评估。但是当使用 await 时你不能拥有它.所以你只需要像你所建议的那样,用更笨拙的方式说话。我个人可能会写:

    async let langRes = traverse(file: languageFile, for: string)
async let engRes = traverse(file: englishFile, for: string)
let result : String
if let temp = try await langRes { result = temp }
else if let temp = try await engRes { result = temp }
else { result = "" }
但是请注意,您必须确定这是否真的很好地使用了 async let。 ,因为你正在做的是启动两个并发进程,为两个 langResengRes ,无论第一个是否成功为您提供非零结果。在我看来,您想要的可能实际上是连续的 await调用,这样如果第一个成功,您甚至不会启动第二个。

关于Swift 5.5 异步操作作为 optional 默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68625044/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com