输入“ MyError?”不符合协议“错误”

时间:2019-12-13 10:12:27

标签: swift

我正在努力了解Swift的新型Result的工作方式。这是我尝试过的:

enum MyError: Error {
    case test
}

typealias MyResult = Result<Data?, MyError?>

我收到此错误:

  

输入“ MyError?”不符合协议“错误”

为什么会这样?谢谢您的帮助。

2 个答案:

答案 0 :(得分:3)

这是因为timestep= cut -d' ' -f1 timestep 的签名:

Result

它不接受可选的public enum Result<Success, Failure> where Failure : Error

Error

会工作的。

答案 1 :(得分:2)

SE-235: Add Result to the Standard Library中讨论了Result类型的介绍。原因之一是与

之类的API相比,提供了更好的解决方案
func dataTask(with url: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask

同时使用可选的成功值(Data?URLResponse?)和可选的错误(Errors?)。 Swift语言不能表示 dataresponse都为非 error都为非。

这导致测试“不可能”组合或使用强制展开(依赖于API 文档)的代码。

Result类型通过使用带有关联值的枚举来解决此问题:

public enum Result<Success, Failure> where Failure : Error {
    /// A success, storing a `Success` value.
    case success(Success)
    /// A failure, storing a `Failure` value.
    case failure(Failure)
}

,以便明确表示成功或失败。 Success类型不再是可选的,并且Failure类型必须是非可选的错误:

enum MyError: Error {
    case test
}

typealias MyResult = Result<Data, MyError>

示例:

let resultOK = MyResult.success(Data())
let resultFailed = MyResult.failure(.test)