我编写这个扩展是为了在等待多个异步任务并行时简化代码.
extension Task{
static func race<T>(_ tasks:[() async throws -> T]) async throws -> T
{
return try await withThrowingTaskGroup(of: T.self) { taskGroup in
for task in tasks {
taskGroup.addTask(operation: task)
}
let first = try await taskGroup.next()
taskGroup.cancelAll()
return first!
}
}
static func all<T>(_ tasks:[() async throws -> T]) async throws -> [T]
{
return try await withThrowingTaskGroup(of: T.self) { taskGroup in
for task in tasks {
taskGroup.addTask(operation: task)
}
return try await taskGroup.collectAsArray()
}
}
}
extension AsyncSequence{
func collectAsArray() async rethrows -> [Element]
{
var results: [Element] = []
for try await result in self
{
results.append(result)
}
return results
}
}
但我得到Generic parameter 'Failure' could not be inferred
和Generic parameter 'Success' could not be inferred
错误时,使用它们
let x = try await Task.race([{return 1},{return 2}])
let y = try await Task.all([{return 1},{return 2}])
因此,我必须通过显式指定返回类型来消除错误
let x = try await Task<Int,Error>.race([{return 1},{return 2}])
let y = try await Task<Int,Error>.all([{return 1},{return 2}])
有没有可能让它自动推断返回类型和错误类型,这样我就不需要显式地编写它们?