swift 将异步抛出表达式转换为结果

5jdjgkvh  于 2023-05-21  发布在  Swift
关注(0)|答案(1)|浏览(100)

根据Preserving the Results of a Throwing Expression文档,可以将抛出表达式转换为Result类型,如下所示:

let singleSample = Result { try UnreliableRandomGenerator().random() }

是否也可以将async抛出表达式转换为Result类型,如:

let singleSample = Result { try await UnreliableRandomGenerator().random() }
wqsoz72f

wqsoz72f1#

没有内置的方法。今天,你不能在stdlib中向init传递异步闭包。这是一个非常简单的添加(基于stdlib代码):

extension Result where Failure == Swift.Error {
  public init(catching body: () async throws -> Success) async {
    do {
      self = .success(try await body())
    } catch {
      self = .failure(error)
    }
  }
}

但请注意,这会使init异步,因此您的代码需要:

let singleSample = await Result { try await UnreliableRandomGenerator().random() }
                   ^^^^^

这当然必须在异步上下文中调用。
有可能您正在尝试做的是创建一个“Future”,以便您可以通过同步上下文传递它。已经存在了。它被称为Task

let singleSample = Task { try await UnreliableRandomGenerator().random() }

当你想把它解析成一个Result时,你可以等待它的.result属性:

let result = await singleSample.result

或者你可以跳过Result,直接使用try-value访问它的值:

let result = try await singleSample.value

在许多情况下,Result在结构化并发世界中并不是那么有用。最好直接使用tryawait。但是它仍然可以非常有助于存储属性,通过允许错误的通道传递,以及与非结构化代码交互,因此Task上的.result属性非常受欢迎,而且它可以轻松地与throws进行转换。

相关问题