You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Objective-C中将Swift抛出的自定义Error转回原类型?

Swift自定义Error在Objective-C中的类型转换问题

能否将桥接后的NSError转回MyNetworkResponse?

可行,具体操作如下:

  1. 调整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
            ]
        }
    }
    
  2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 15:50:17