Swift 3.1:自定义错误转换为 NSError 以访问其域属性时崩溃
Posted
技术标签:
【中文标题】Swift 3.1:自定义错误转换为 NSError 以访问其域属性时崩溃【英文标题】:Swift 3.1: Crash when custom error is converted to NSError to access its domain property 【发布时间】:2017-04-05 07:49:18 【问题描述】:我的 Swift 应用程序有一个自定义错误系统,其中 MyError
只是一个符合 Error
的简单类。现在,每当第三方库 (PromiseKit) 尝试将此错误转换为 NSError
然后访问其 domain
属性时,该应用程序似乎就会崩溃。在我自己的代码中,这样做可以按预期工作,那么为什么它会在库中崩溃以及处理它的正确方法是什么?
Crashed: com.apple.main-thread
0 libswiftCore.dylib 0x1011d86d8 _hidden#19226_ (__hidden#19178_:1788)
1 libswiftCore.dylib 0x1011cda3c _hidden#19206_ (__hidden#19447_:4045)
2 libswiftCore.dylib 0x1011cda3c _hidden#19206_ (__hidden#19447_:4045)
3 libswiftCore.dylib 0x1011cdc90 swift_getTypeName (__hidden#19406_:1731)
4 AppName 0x1001dafec specialized (_adHocPrint_unlocked<A, B where ...> (A, Mirror, inout B, isDebugPrint : Bool) -> ()).(printTypeName #1)<A, B where ...> (Any.Type) -> () (MyError.swift)
5 AppName 0x1001db4f0 specialized specialized _adHocPrint_unlocked<A, B where ...> (A, Mirror, inout B, isDebugPrint : Bool) -> () (MyError.swift)
6 AppName 0x1001dafb4 specialized _debugPrint_unlocked<A, B where ...> (A, inout B) -> () (MyError.swift)
7 AppName 0x1001dac00 protocol witness for Error._domain.getter in conformance MyError (MyError.swift)
8 libswiftCore.dylib 0x10104fa14 swift_stdlib_getErrorDomainNSString (__hidden#18979_:140)
9 libswiftCore.dylib 0x1011f96d8 _hidden#21248_ (__hidden#21275_:440)
10 PromiseKit 0x100dc7d4c Error.isCancelledError.getter (Error.swift:145)
【问题讨论】:
您的MyError
是否包含域属性?
不。在我自己的代码中,它似乎回退到使用其类型名称作为域值。
看看***.com/questions/32981542/…可能会有帮助
你必须采用CustomNSError,例子见***.com/a/39176551/1187415
您找到解决方案了吗? @villapossu
【参考方案1】:
从 Error 转换为 NSError 时,它试图访问 errorCode
和 errorDomain
。添加这些扩展解决了我在相同情况下的问题。
extension CustomError: LocalizedError
public var errorDescription: String?
return "Some localized description"
extension CustomError: CustomNSError
public static var errorDomain: String
return "Some Domain Name"
public var errorCode: Int
return 204 //Should be your custom error code.
【讨论】:
我显然是通过实现public var _domain
和 public var _code
使它工作的,但很高兴知道这也有适当的解决方案!以上是关于Swift 3.1:自定义错误转换为 NSError 以访问其域属性时崩溃的主要内容,如果未能解决你的问题,请参考以下文章
将 DataSnapshot 转换为自定义结构对象 - Swift 4