为何-Wobjc-literal-conversion编译警告会被预处理器忽略?
排查思路
- 首先验证Swift类导出的ObjC接口类型
找到Xcode自动生成的{YourModuleName}-Swift.h头文件,查看someProperty的实际定义:
如果因@NSManaged关键字的存在,导出类型为@property (nonatomic, strong) NSNumber *someProperty;而非基础类型BOOL,那么给NSNumber对象赋值对象字面量本身是合法操作,自然不会触发-Wobjc-literal-conversion警告——该警告仅在对象字面量赋值给基础数据类型时才会触发。 - 检查编译参数是否被高优先级配置覆盖
查看对应Target的编译设置,是否存在-Wno-objc-literal-conversion的配置,该参数会覆盖你开启警告的配置。也可以直接在Xcode的编译日志中,查找对应ObjC文件的编译命令行,搜索是否存在关闭该警告的参数。 - 确认当前Clang版本支持该警告
运行clang --help | grep objc-literal-conversion验证你使用的Xcode对应的Clang版本确实支持该警告选项,版本过低的Clang不会识别该参数,配置自然无效。 - 验证CoreData动态特性的影响
@NSManaged修饰的属性由CoreData在运行时动态实现存取方法,编译期Clang可能会跳过该类属性的严格类型校验。你可以新增一个普通的、非NSManagedObject子类的Swift类,导出BOOL类型属性到ObjC后尝试赋值对象字面量,如果普通类能正常触发警告,只有CoreData实体类不触发,就说明是CoreData动态属性的编译期校验机制导致警告不生效。
临时规避方案
如果最终确认是CoreData属性的校验限制,可以通过在ObjC编码规范中增加CoreData属性赋值的类型检查要求,或者接入自定义Clang插件、静态分析规则来拦截这类错误赋值。
内容的提问来源于stack exchange,提问作者olha
相关产品推荐
相关产品推荐

