在Swift中捕获objc exception的方法

Swift虽然有比ObjC更加成熟的异常处理系统,但Swift本身是无法捕捉ObjC的异常的。理论上苹果在提供Swift接口时会将一些异常转化成Swift的异常,但就目前来讲(Swift3.1),objc runtime部分的异常并没有被转化成Swift异常。今天我就碰到了一次KVO removeObserver不当,抛出ObjC异常导致程序崩溃的情况。

按照NShipster的说法,安全的移除KVO observer的方法是:

然而苹果并没有对removeObserver这个方法加入Swift异常,导致单纯使用Swift无法捕捉该异常。

StackOverflow中的这篇回答给出了该问题的解决方案。原理是通过Objective C封装一个函数,函数签名中带有 error:(__autoreleasing NSError **)error; ,Swift调用该函数时,能自动将其转换为Swift Exceptions。

完整代码:

Swift中的调用:

 

No Comments

Post a Comment