Swift 3 @objc推断警告无法消除,请求技术帮助
解决Swift 4中Swift 3 @objc推断警告残留的问题
我之前在维护从Swift 3迁移到Swift 4的项目时,也遇到过改了构建设置还不消警告的坑,给你几个实用的解决办法:
1. 确认构建设置真正生效
先仔细检查项目和目标两级的构建设置:
- 打开Xcode,选中你的项目,切换到「Targets」标签页,选择你的
Rushed目标 - 搜索
Swift 3 @objc Inference,确保它被设置为Default(这个选项等同于关闭Swift 3风格的自动@objc推断) - 别忘了检查项目根级的Build Settings,有时候项目级的配置会覆盖目标级的
2. 手动标记需要暴露给OC的代码
Swift 4不再自动给NSObject子类的所有方法/属性添加@objc,所以你需要手动给那些需要被OC调用的代码加上@objc标记:
- 按钮点击、定时器这类需要Selector的方法
- 要被OC类调用的属性或方法
- 遵循@objc协议的方法
举个例子:
// Swift 3里可以自动推断,Swift 4需要手动加@objc @objc func handleButtonTap() { // 你的代码 }
如果某个类里大部分方法都需要暴露给OC,可以用@objcMembers标记整个类(这是过渡方案,建议尽量精准标记单个方法):
@objcMembers class MyViewController: UIViewController { // 这里的方法/属性会自动添加@objc }
3. 开启日志定位隐藏的警告源
Xcode提示里提到的日志功能能帮你找到那些没在代码里标记的警告:
- 点击「Edit Scheme」→ 选择「Run」→ 切换到「Arguments」标签页
- 在「Environment Variables」里添加两个变量:
OS_ACTIVITY_MODE=enableSWIFT_OBJC_INFERENCE_LOGGING=YES
- 运行项目,控制台会输出具体哪些代码触发了@objc推断警告,跟着日志去修改对应的代码就行
4. 清理项目缓存
有时候Xcode的缓存会导致设置不生效,试试这些操作:
- 按
Cmd+Shift+K清理Build Folder - 前往
~/Library/Developer/Xcode/DerivedData,删除对应项目的缓存文件夹 - 重启Xcode后重新构建项目
5. 检查第三方依赖
如果项目里用了Swift 3编写的第三方库,它们也可能触发这个警告:
- 优先尝试把库升级到支持Swift 4的版本
- 如果暂时没法升级,可以给库的类添加
@objcMembers(不过这需要修改库源码,或者用CocoaPods的post_install钩子处理)
内容的提问来源于stack exchange,提问作者Adi219
相关产品推荐
相关产品推荐

