使用 case :
为了能够记录错误,我们使它们符合特定的协议. 这似乎对自定义错误有效,然而,判断或将基础错误(如URLError)强制转换为此协议似乎失败了.
我不知道这里有什么不同.
在本例中:我们有一个视图模型,它执行可能导致错误的操作. 我们想用我们的记录器记录这个错误.
示例:
// Protocol that makes an error loggable
protocol LoggableError: Error {
var message: String { get }
}
// Our custom error:
enum CustomError: Error {
case someError
}
extension CustomError: LoggableError {
var message: String {
"Some error occurred"
}
}
// URL error conforming to our LoggableError:
extension URLError: LoggableError {
var message: String {
"Some network error occurred"
}
}
// The logger
protocol LoggerProtocol {
func handle(error: some Error)
}
class Logger: LoggerProtocol {
func handle(error: some Error) {
guard let error = error as? LoggableError else { fatalError("Cast failed") }
print(error.message)
}
}
// The view model
class ViewModel {
private let logger: LoggerProtocol
init(logger: LoggerProtocol) {
self.logger = logger
}
func doSomething() {
do {
try doSomethingDangerous()
} catch {
logger.handle(error: error)
}
}
private func doSomethingDangerous() throws {
throw CustomError.someError // this works
// throw URLError(.notConnectedToInternet) // this triggers the fatalError
}
}
// Trigger
let viewModel = ViewModel(logger: Logger())
viewModel.doSomething()
谁能告诉我我哪里做错了或者为什么这不管用? 经过7年的SWIFT开发,我似乎仍然不理解协议:D