【发布时间】:2019-12-19 16:37:24
【问题描述】:
我已经阅读了 Swift Evolution post on the improved bridging 和其他一些在线资源,但仍然缺少一些东西。
鉴于此自定义 Error 枚举:
public enum MyNetworkError: Error {
case networkOffline
case httpError(status: Int)
case unknown
case systemError(errno: Int)
}
Objective-C 应用程序应该能够读取错误对象并以某种方式提取错误名称(networkOffline、httpError、unknown、systemError)和大小写参数(httpError.status 和 @987654329 @)。
将上述转换为NSError 的结果令人惊讶,我正在尝试了解如何改进:
let nse_A = MyNetworkError.networkOffline as NSError
let nse_B = MyNetworkError.httpError(status: 503) as NSError
let nse_C = MyNetworkError.unknown as NSError
let nse_D = MyNetworkError.systemError(42) as NSError
首先,生成的错误代码。似乎有参数的案例,无论它们的顺序如何,都从零开始得到code:
print(nse_A.code) // 2 (expected: 0)
print(nse_B.code) // 0 (expected: 1)
print(nse_C.code) // 3 (expected: 2)
print(nse_D.code) // 1 (expected: 3)
鉴于应用报告的错误代码,现在更难分辨实际的错误情况。
其次,我希望这样一种智能机制(特别是因为它是编译器生成的)也可以将 case 参数复制到 userInfo 字典中 - 但它没有。
我做错了吗,还是我必须完全实现CustomNSError 协议才能获得有意义且一致的NSError 对象?当然,这是一个选项,但我希望它会自动完成(有点像 Codable 的魔法)。
另外,应用程序能否获取错误案例名称为String?
作为参考,上面的 sn-ps 是在 Xcode 10.3 Playground 中执行的。
【问题讨论】: