Swift中调用抛出函数,如何更简便转为Result<T, Error>类型?
简化Swift异步抛出函数到Result类型的转换
你可以通过封装通用工具逻辑,彻底摆脱重复的do/catch代码块,以下是几种简洁的实现方式:
方法一:给Result添加异步初始化扩展
给Result类型写一个通用扩展,专门处理异步抛出的任务:
extension Result where Success: Sendable, Failure == Error { static func async(catching operation: @Sendable () async throws -> Success) async -> Self { do { return .success(try await operation()) } catch { return .failure(error) } } }
调用时直接一行搞定:
model = await Result.async(catching: getModel)
方法二:独立工具函数
如果不想扩展系统类型,也可以写一个独立的通用函数:
func asyncResult<T: Sendable>(_ task: @Sendable () async throws -> T) async -> Result<T, Error> { do { return .success(try await task()) } catch { return .failure(error) } }
使用方式同样简洁:
model = await asyncResult(getModel)
方法三:内联简化写法(无复用需求时)
如果只是单次使用,不想额外封装,可以用更紧凑的内联do/catch写法:
model = await do { try await getModel() } catch { error } as Result<Model, Error>
这些方式都能帮你把重复的错误捕获逻辑抽离出来,让视图中的任务代码更简洁易读。
内容的提问来源于stack exchange,提问作者Aaron Christiansen
相关产品推荐
相关产品推荐

