【问题标题】:Casting CustomError to ErrorType to NSError loses userInfo将 CustomError 转换为 ErrorType 到 NSError 会丢失 userInfo
【发布时间】:2015-12-10 21:09:36
【问题描述】:

尝试将CustomError 强制转换为兼容类型(ErrorType、NSError)会导致用户信息字典丢失:

class CustomError: NSError {}

let error = CustomError(domain: "com.customerrorexample", code: 500, userInfo: [NSLocalizedDescriptionKey: "A great description"])

然后

((error as ErrorType) as NSError).localizedDescription // "The operation couldn't be completed..."

但是这将打印正确的描述:

((error as ErrorType) as! CustomError).localizedDescription // "A great description"

((CustomError as ErrorType) as NSError) 怎么会丢失 userInfo 字典?知道我的实际代码将采用ErrorType 作为输入并打印其localizedDescription,我该如何解决它——无论 NSError 子类是什么,它都应该是准确的?

编辑

在此处查看我自己的答案:https://stackoverflow.com/a/34033365/646960。仍然不是最佳解决方案,请随时提出更好的解决方案。

【问题讨论】:

  • 当你似乎没有使用那个协议时,为什么标题提到 CustomNSError?
  • @MichaelTsai 我的意思是CustomError,在我的代码中描述为只是一个扩展NSError 的类。原来CustomNSError 现在是一个 SDK 类,在我写这篇文章的时候(2015 年)还不是。很抱歉造成混乱
  • 酷。感谢您的澄清。这应该可以防止现在搜索 CustomNSError 协议的人感到困惑。

标签: swift swift2 xcode7 foundation


【解决方案1】:

似乎阻止将 ErrorType 转换为 NSError 的编译器魔法效果很好:

((error as Any) as! NSError).localizedDescription // "A great description"

【讨论】:

  • 这对我有用。我将此添加为扩展。 extension ErrorType { var userDescription: String { if let error = ((self as Any) as? NSError) where !error.localizedDescription.isEmpty { return error.localizedDescription } else { return "Something went wrong." } } }
猜你喜欢
  • 2015-10-03
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 2016-04-13
相关资源
最近更新 更多