Swift调用带NSError指针的Objective-C函数遇异常求助
问题根源与解决方案
1. Objective-C到Swift的方法桥接规则
你的Objective-C方法属于带NSError**输出参数的布尔返回方法,Swift会自动对这类方法做特殊桥接:
- 原
BOOL返回值被忽略,方法返回值变为Void,因为错误通过抛出异常传递 error:(NSError**)error参数被自动隐藏,无需显式传入,改用try/try?/try!处理错误
这就是你看不到error参数选项、返回值不是Bool的核心原因。
2. result为nil的原因
使用try?调用时,若Objective-C方法内部通过*error = [NSError ...]生成了错误,Swift会将其转换为抛出异常,try?捕获异常后会返回nil。所以result为nil说明方法执行时触发了错误逻辑。
3. 正确调用方式
方式一:捕获具体错误(推荐)
do { try self.loginState.start(withAccount: ACCOUNT_KEY, andUser: USER_ID) // 走到这里代表原Objective-C方法返回YES,执行成功 } catch { // 捕获到原Objective-C中设置的错误,可打印或处理 print("执行失败:\(error.localizedDescription)") }
方式二:仅判断成功与否
如果不需要具体错误信息,可通过可选绑定快速判断:
if try? self.loginState.start(withAccount: ACCOUNT_KEY, andUser: USER_ID) != nil { // 执行成功 } else { // 执行失败(对应result为nil的情况) }
额外检查:Objective-C方法语法
确保你的Objective-C方法签名语法正确(参数前必须加冒号):
- (BOOL)startWithAccount:(NSString*)account andUser:(NSString*)user error:(NSError**)error { // 实现逻辑:失败时设置error并返回NO,成功返回YES if (/* 失败条件 */) { *error = [NSError errorWithDomain:@"YourDomain" code:-1 userInfo:@{NSLocalizedDescriptionKey:@"失败原因"}]; return NO; } return YES; }
内容的提问来源于stack exchange,提问作者YosiFZ
相关产品推荐
相关产品推荐

