如何在Objective-C中将Swift抛出的自定义Error转回原类型?
Swift自定义Error在Objective-C中的类型转换问题
能否将桥接后的NSError转回MyNetworkResponse?
可行,具体操作如下:
调整Swift自定义错误类
确保MyNetworkResponse类在实现Error协议的同时,将自身实例存入NSError的userInfo字典。可通过扩展实现LocalizedError协议定义错误信息,同时自定义userInfo:@objc public final class MyNetworkResponse: NSObject, Error { @objc public let responseCode: Int @objc public let responseMessage: String @objc init(code: Int, message: String) { self.responseCode = code self.responseMessage = message super.init() } } extension MyNetworkResponse: LocalizedError { public var errorDescription: String? { return responseMessage } public var errorUserInfo: [String: Any] { return [ "OriginalNetworkResponse": self ] } }在Objective-C中恢复原类型
Swift抛出的错误桥接为NSError后,可从userInfo中取出原MyNetworkResponse实例:// 假设拿到NSError实例error MyNetworkResponse *originalResp = error.userInfo[@"OriginalNetworkResponse"]; if ([originalResp isKindOfClass:[MyNetworkResponse class]]) { // 访问自定义属性 NSLog(@"Code: %ld, Message: %@", originalResp.responseCode, originalResp.responseMessage); }这种自定义userInfo键的方式是最可靠的,Swift自动桥接的
underlyingError不会直接指向原自定义对象。
@objc类型能否覆盖异常类型?
Swift的@objc类无法直接覆盖Objective-C的NSException异常类型,两者分属不同的错误处理体系:
- Swift的
Error会自动桥接为Objective-C的NSError,而非NSException。 - Objective-C的
NSException无法用Swift标准的do-catch捕获,需借助ObjC.catchException这类工具方法处理。 - 若要让Swift错误在Objective-C中以类似异常的方式处理,只能通过NSError的回调(比如Objective-C方法的
NSError**参数)传递,而非直接抛出Objective-C异常。
内容的提问来源于stack exchange,提问作者Chris G
相关产品推荐
相关产品推荐

