从Swift 2的ErrorType获得更好的NSErrors

自10.2.7版以来,可可就包含了NSError 。 这是在Cocoa应用程序中表达和返回错误的标准方法。

NSError不仅仅是简单的错误处理代码可以使用的对象。 它具有许多属性和相关的API,尤其是在macOS上,使其非常适合直接呈现给用户。

自从Swift 2引入以来,就可以抛出 Swift ErrorType实例,并使它们自动桥接到NSError。 不幸的是,这种桥接行为相当有限。 桥接到Objective-C API的ErrorType实例非常简单。 他们缺乏本地化的描述,故障原因,恢复建议,帮助锚等。

如果您仅开发移动应用程序,这似乎并不那么糟糕。 大多数iOS应用程序不使用错误恢复或帮助锚等功能

如果像我们一样开发macOS应用程序,那就更成问题了。 macOS内置了使用NSResponderNSAlert的initWithError:上的-presentError 呈现丰富错误警报的支持。 如果提供的NSError实例具有完全填充的userInfo字典,则将大大改善用户体验。

例如:

相对于:

尽管iOS并没有像macOS那样立即提供给用户呈现NSError的功能,但是您可以使用UIAlertController或一些其他自定义的瞬态或内联警报,轻松在自己的应用中为NSError呈现创建类似的系统。 我们已经在为客户开发的iOS应用程序中做到了这一点。

未来是光明的

Swift Evolution提案SE-0112描述了Swift的未来版本将如何改善Error错误类型的新名称)与NSError的桥接。 该提案解决了当前桥接行为的所有局限性。

但是目前,我们必须自生自灭

但是,与此同时,我们陷入了Swift 2的困扰– Xcode 8和Swift 3的初始beta版本没有包含SE-0112的实现,但是最近它已经实现(即,Xcode 8 beta 5包含了新的Error协议)。

下面,我提供了一种扩展ErrorType的简单机制,以将更丰富的NSError行为带入您的iOS和macOS Swift 2应用程序。

NSErrorUserInfoValueProviding

Itty Bitty Apps 总部位于澳大利亚墨尔本, 为大小客户提供了出色的移动和Mac软件。 这也使 揭示 -适用于iOS开发人员的功能强大的运行时视图调试。