我正在努力理解新型ResultSwift 的工作原理。这是我尝试过的:
enum MyError: Error {
case test
}
typealias MyResult = Result<Data?, MyError?>
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
输入“我的错误?” 不符合协议“错误”
为什么会这样?感谢您的帮助。
这是因为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)
会工作。
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?)。雨燕的语言无法表达或者两者data并response有非空或者 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)
| 归档时间: |
|
| 查看次数: |
1006 次 |
| 最近记录: |