Swift实现Objective-C协议:抛出方法返回Bool的冲突错误解决
问题解决方法与原因分析
解决步骤
要解决这个矛盾,你需要放弃Swift的throws语法,严格按照Objective-C协议的原始方法签名实现,同时给方法加上@objc标注,确保能被Objective-C识别:
class KabaSDKThunk: NSObject, IKabaSDK { @objc func isStarted(error: NSErrorPointer) -> Bool { do { try sdk.isStarted() print("thunk getIsStarted") return true } catch let err as NSError { print("thunk getIsStarted throws \(err)") error?.pointee = err return false } catch { // 包装非NSError类型的异常为标准NSError let unknownError = NSError(domain: "KabaSDKThunkError", code: -1, userInfo: [NSLocalizedDescriptionKey: "Unknown error"]) error?.pointee = unknownError print("thunk getIsStarted throws unknown error") return false } } // 其他协议方法实现... }
原因解释
为什么会出现互斥错误?
这是Objective-C与Swift错误处理机制的桥接限制导致的:
- 协议是Objective-C定义的,
__attribute__((swift_error(nonnull_error)))只是给Swift调用者提供的语法糖——让调用该方法时可以用throws语法,但实现协议时必须严格遵循Objective-C的方法签名。 - Swift的
throws方法如果返回Bool这类基本值类型,无法桥接到Objective-C(Objective-C不支持带返回值的异常抛出模式),因此Xcode报错“抛出方法无法实现@objc协议要求”;但去掉返回值又不符合协议明确要求的Bool返回类型,最终形成互斥错误。
为什么Objective-C方法要同时用Bool返回值和NSError**?
这是Objective-C传统的错误处理范式:
- 返回
Bool用于快速判断操作是否成功(true代表成功,false代表失败) NSError* _Nullable __autoreleasing * _Nullable error参数用于在失败时传递具体错误详情swift_error属性是苹果提供的适配层,让Swift调用者可以用更简洁的throws逻辑处理,但底层依然基于Objective-C的错误传递规则。
内容的提问来源于stack exchange,提问作者niagara
相关产品推荐
相关产品推荐

