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

Ano*_*ude 1 swift

我正在努力理解新型ResultSwift 的工作原理。这是我尝试过的:

enum MyError: Error {
    case test
}

typealias MyResult = Result<Data?, MyError?>
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

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

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

EDU*_*sta 5

这是因为Result的签名:

public enum Result<Success, Failure> where Failure : Error
Run Code Online (Sandbox Code Playgroud)

它不接受可选的Error.

typealias MyResult = Result<Data?, MyError>
Run Code Online (Sandbox Code Playgroud)

会工作。


Mar*_*n R 5

SE-235: Add Result to the Standard Library 中Result讨论了该类型的引入。原因之一是提供比 API 更好的解决方案,例如

func dataTask(with url: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask
Run Code Online (Sandbox Code Playgroud)

使用可选的成功值 ( Data?, URLResponse?) 和可选的错误 ( Errors?)。雨燕的语言无法表达或者两者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)
}
Run Code Online (Sandbox Code Playgroud)

以便它明确表示成功或失败。该Success类型不一定是一个可选的了,而且Failure类型必须是不可选的错误:

enum MyError: Error {
    case test
}

typealias MyResult = Result<Data, MyError>
Run Code Online (Sandbox Code Playgroud)

例子:

let resultOK = MyResult.success(Data())
let resultFailed = MyResult.failure(.test)
Run Code Online (Sandbox Code Playgroud)