在 Swift 并发中,Task 表示一个可以异步执行的任务。每个 Task 都有一个 result 属性,用于描述任务的执行结果。
Task.result 的类型是一个 Result 枚举,定义为:
Result<Success, Failure>
Task.result 提供了一种方法来访问任务的完成状态和返回值:
Success:任务成功完成后返回的值类型。
Failure:任务失败时返回的错误类型,通常是符合 Error 协议的类型。
可以通过模式匹配、switch 或 Result 的方法(如 get())来提取成功值或处理错误。
基本用法
Task异步任务中,Task.result通常用于返回结果。例如:
let task = Task { () -> Int in
try await Task.sleep(nanoseconds: 1_000_000_000)
return 42
}
这里的task是一个异步任务,类型为:
Task<Int, Error>
成功返回Int,失败可能会抛出Error。
使用方法
1、访问 Task.result 的两种方式
通过 switch 提取值或错误:
let result = await task.result
switch result {
case .success(let value):
print("Success: \(value)")
case .failure(let error):
print("Error: \(error.localizedDescription)")
}
或者使用 get() 方法提取值或抛出错误:
Result 提供了一个 get() 方法,可以简化值的提取:
do {
let value = try result.get()
print("Success: \(value)")
} catch {
print("Error: \(error.localizedDescription)")
}
注意:如果 Result 是 .failure(error),调用 get() 会抛出错误。
和Task.value的区别
1、Task.result:
返回 Result<Success, Failure>。
必须通过 switch 或 get() 来提取值或错误。
2、Task.value:
返回 Success 值。
如果任务失败,value 会抛出错误。
示例对比:
// 使用 result
let result = await task.result
switch result {
case .success(let value):
print("Success: \(value)")
case .failure(let error):
print("Error: \(error.localizedDescription)")
}
// 使用 value
do {
let value = try await task.value
print("Success: \(value)")
} catch {
print("Error: \(error.localizedDescription)")
}
Task.value简化返回类型,它直接返回任务的成功值或在失败时抛出错误。
适合需要任务结果,但不需要显式地处理 Result 枚举的情况下。
总结
Task.result 提供了一种安全的方法来检查任务的结果。相比于直接访问返回值,它显式地处理了成功和失败的两种情况。
Task.result 提供安全的异步错误处理方式,是 Swift 并发模型的一部分。
通过 switch 或 get(),可以轻松提取任务的结果或捕获错误。
