gpt4 book ai didi

swift - 在 Swift 5 的结果类型中指定自定义错误类型

转载 作者:可可西里 更新时间:2023-11-01 00:54:10 25 4
gpt4 key购买 nike

我正在尝试创建一个 Result Foundation for Swift 5 中具有自定义错误类型和内置结果类型的变量,但我不能完全让类型系统理解我想要抛出的错误类型。

下面的代码无法编译。

import Foundation

enum CustomError: String, Error {
case somethingBadHappened
}

struct Model {
let value: Int
}

class Request {
func execute(number: Int, completion: @escaping (Result<Model, CustomError>) -> Void) {
let result = Result { () throws -> Model in
if (number < 20) {
throw CustomError.somethingBadHappened
} else {
return Model(value: number)
}
}
// compiler complains here about: Cannot convert value of type 'Result<Model, Error>' to expected argument type 'Result<Model, CustomError>'
completion(result)
}
}

let request = Request()
request.execute(number: 19) { result in
switch result {
case .success(let value): print("Succeded with \(value)")
case .failure(let error): print("Failed with \(error)")
}

}

将完成闭包的签名更改为 completion: @escaping (Result<Model, Error>) -> Void有效,但我没有使用自定义错误类型。

如何让类型系统理解我想使用自定义错误类型?

最佳答案

很抱歉给出第二个答案,但需要对 fphilipe 的答案进行更正。

可以使用init(catching:)形成结果并将其作为 Result<Model, CustomError> 返回.那就是mapError是为了!像这样:

enum CustomError: String, Error {
case somethingBadHappened
}

struct Model {
let value: Int
}

class Request {
func execute(number: Int, completion: @escaping (Result<Model, CustomError>) -> Void) {
let result = Result { () throws -> Model in
if (number < 20) {
throw NSError()
} else {
return Model(value: number)
}
}.mapError { err in
return CustomError.somethingBadHappened
}
completion(result)
}
}

我必须扔东西才能形成初始 Result<Model, Error> ,所以我只是抛出一个 NSError 作为一种占位符。但是然后 mapError出现并将其转换为 Result<Model, CustomError> . mapError的力量|是它只改变失败时发生的事情。

因此我们能够保持代码的原始形式。

关于swift - 在 Swift 5 的结果类型中指定自定义错误类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55784651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com