KMM项目Swift实现Kotlin接口报不遵守LocalUserSource协议错误如何解决
排查方向
- 检查Swift类是否继承
NSObject:Kotlin/Native导出的协议本质是ObjC协议,Swift侧实现类必须继承NSObject才能正常适配ObjC协议,你的示例代码中DBUserSource仅声明实现协议未声明父类,这是高频触发该错误的原因,修正后代码示例:
class DBUserSource: NSObject, LocalUserSource { // 方法实现 }
- 检查方法和参数的注解、类型匹配:
- 所有协议实现的方法前必须加
@objc修饰符,否则ObjC运行时无法识别方法实现 - 严格匹配参数类型:从你提供的ObjC头可见,生成的方法参数类型分别为
CommonUser、CommonBoolean,和你当前代码中的common.User、KotlinBoolean不匹配,需替换为头文件中定义的对应类型 - 注意可空性匹配:如果Kotlin侧返回值是非空
Boolean,回调中的布尔参数不可声明为可选类型,必须和生成协议的参数可空性完全一致
- 所有协议实现的方法前必须加
- 检查Kotlin编译配置变更:
- 确认近期是否升级了Kotlin版本,1.8+版本的K/N对suspend函数的Swift导出规则有调整,若开启了
kotlin.native.swiftNameAddVisibilityPrefix等新的命名开关,会导致生成的协议方法名和之前不匹配 - 确认是否修改了framework导出的类前缀配置,如果前缀从
Kotlin改成了Common,Swift侧的对应类型也要同步修改
- 确认近期是否升级了Kotlin版本,1.8+版本的K/N对suspend函数的Swift导出规则有调整,若开启了
- 检查Xcode链接配置:确认Xcode当前构建模式(Debug/Release)链接的KMP framework和你Gradle构建输出的framework版本一致,不同构建模式下生成的framework符号可能存在差异,链接错版本也会触发协议不匹配的错误
- 临时验证方案:直接复制Xcode报错提示中要求实现的协议方法签名,替换你当前手写的方法,避免手动拼写的参数名、类型、可空性出现误差
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

