我正在努力了解Swift的新型Result
的工作方式。这是我尝试过的:
enum MyError: Error {
case test
}
typealias MyResult = Result<Data?, MyError?>
我收到此错误:
输入“ MyError?”不符合协议“错误”
为什么会这样?谢谢您的帮助。
答案 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
类型的介绍。原因之一是与
func dataTask(with url: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask
同时使用可选的成功值(Data?
,URLResponse?
)和可选的错误(Errors?
)。 Swift语言不能表示 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)
}
,以便明确表示成功或失败。 Success
类型不再是可选的,并且Failure
类型必须是非可选的错误:
enum MyError: Error {
case test
}
typealias MyResult = Result<Data, MyError>
示例:
let resultOK = MyResult.success(Data())
let resultFailed = MyResult.failure(.test)