用于等待两个 async let 返回类型 void 的简洁语法

问题描述 投票:0回答:1

Swift 中的两个异步函数应该同时启动,然后在某个时刻等待。我已经找到了一个解决方案,但我对语法并不是 100% 满意。如果可能的话,我想用更清晰的语法编写以下代码。

  1. 我知道我可以使用任务组
  2. 由于某种原因,我需要显式声明返回类型,即使从 func 返回类型中可以清楚地看出。
Task {
    async let task1: () = task1()
    async let task2: () = task2()
    
    _ = await [task1, task2]
}

func task1() async { }
func task2() async { }
swift
1个回答
0
投票

您当前的代码是完全可以接受的,但我确实认为

TaskGroup
更好地表达了您的意图。

await withTaskGroup(of: Void.self) { taskGroup in
    taskGroup.addTask { await task1() }
    taskGroup.addTask { await task2() }

    // or alternatively:
    // taskGroup.addTask(operation: task1)
    // taskGroup.addTask(operation: task2)
}

顺便说一下,您需要将

task1
/
task2
函数标记为
@Sendable
,以便在任务之间传递它们,无论您最终采用哪种方法。

TaskGroup 在我看来是用于动态范围的任务,而不是用于两个硬编码的任务。

它当然可以处理动态数量的任务,但对于固定数量的任务来说也完全没问题。事实上,您使用的结构化并发语法实际上只是在底层构造任务组的语法糖。

出于某种原因,我需要显式声明返回类型,即使从 func 返回类型中可以清楚地看出返回类型

大多数将

Void
(
()
) 结果分配给变量可能是无意的,因此这是语法盐,以确认这确实是您的意图。真正需要这样做的情况非常罕见且不寻常。

© www.soinside.com 2019 - 2024. All rights reserved.