Swift项目引入Objective-C文件后出现'found this candidate'编译错误求助
Swift与Objective-C桥接Header导入报错的排查方案
我之前也碰到过这种桥接Header配置后Swift依然找不到OC类的糟心情况,给你整理几个容易被忽略的排查细节,说不定能解决问题:
确认桥接Header的路径配置绝对正确
打开项目的Build Settings,搜索Objective-C Bridging Header:- 路径必须是相对于项目根目录的相对路径,比如你的桥接文件在项目根目录下,就写
YourProjectName/YourBridgingHeader.h;如果在子文件夹里,要对应好层级,比如YourProjectName/Classes/MyBridgingHeader.h - 绝对路径尽量别用,换开发环境就会失效
- 同时检查
Install Objective-C Compatibility Header是否设置为YES
- 路径必须是相对于项目根目录的相对路径,比如你的桥接文件在项目根目录下,就写
检查OC文件的Target归属
选中你的Objective-C文件,查看右侧File Inspector里的Target Membership,一定要勾选当前的主Target——很多时候不小心漏勾,就会导致编译器没把这个OC文件纳入编译,Swift自然找不到- 注意:桥接Header文件本身不要勾选Target Membership!它是给编译器做桥接用的,不需要加入编译目标,勾了反而可能出问题
先确保OC文件本身能正常编译
有时候不是桥接的问题,是OC文件自己有语法错误(比如未声明的类、括号不匹配、头文件循环引用)。先单独编译OC文件(可以新建一个简单的OC测试类试试),确认OC代码能正常通过编译后,再导入桥接Header里- 桥接Header里导入OC文件时,优先用
#import "XXX.h",如果用@class XXX,只能做指针声明,Swift无法访问类的具体方法和属性,也会报错
- 桥接Header里导入OC文件时,优先用
清理缓存+重启Xcode
Xcode的缓存有时候会抽风:- 执行
Product > Clean Build Folder(按住Option键点击Product菜单就能看到这个选项,比普通Clean更彻底) - 删掉Derived Data:通过
Xcode > Settings > Locations > Derived Data打开文件夹,把里面的内容全部删除 - 彻底退出Xcode再重新打开项目
- 执行
Swift文件里不要手动导入桥接Header
很多新手会犯这个错:桥接Header是全局生效的,只要配置正确,Swift文件里直接用OC类就行,不需要写import YourBridgingHeader.h——手动导入反而会触发报错排查命名冲突或模块问题
- 如果你的项目是Framework,要确保
Defines Module设置为YES,且Module Name和项目名称一致 - 检查OC类的名称是不是和Swift系统类重名了,比如你写了个自定义
UIButton分类但命名冲突,也会导致识别失败,可以临时给OC类改个名字测试
- 如果你的项目是Framework,要确保
如果以上方法都试过还是不行,建议补充下具体的报错信息(比如是Use of undeclared type 'XXX'还是其他),以及桥接Header的内容、OC文件的结构,这样能更精准地定位问题。
内容的提问来源于stack exchange,提问作者Varinder Singh iPhone Dev
相关产品推荐
相关产品推荐

