Swift/Obj-C项目中如何忽略导入框架的警告?
哈哈,这个问题我太有共鸣了!之前开启警告转错误后,第三方框架的一堆警告直接把编译搞挂,试了好几种方法才搞定,给你整理几个靠谱的方案:
精准忽略单个框架的特定警告
如果只是某一个框架的特定警告烦人,可以在导入的时候用编译指令包裹,精准屏蔽:#pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" // 替换成你要忽略的警告类型 #import <ProblematicFramework/ProblematicFramework.h> #pragma clang diagnostic pop常见的警告类型比如
-Wunused-variable(未使用变量)、-Wobjc-property-no-attribute(属性缺少修饰符),如果想暂时忽略这个框架的所有警告,把第二行换成#pragma clang diagnostic ignored "-Wall"就行。全局标记框架为系统级(自动忽略警告)
打开Xcode的构建设置,找到Other C Flags,添加以下内容:-isystem "$(SRCROOT)/Path/To/Your/Framework.framework/Headers"-isystem会告诉编译器这个目录是系统级头文件,自动跳过其中的警告检查,适合整个框架都有警告的情况。
导入时忽略特定警告
Swift 5.3+支持用未公开的属性在导入时屏蔽警告(虽然是未公开,但目前各个版本都能用,注意后续版本可能调整):@_diagnostic(ignore: "deprecated_declarations") import ProblematicFramework把
deprecated_declarations换成你要忽略的警告标识就行。全局通过编译标记屏蔽
到构建设置的Swift Compiler - Custom Flags->Other Swift Flags里添加:-Xcc -isystem -Xcc "$(SRCROOT)/Path/To/Your/Framework.framework/Headers"原理和Obj-C的
-isystem一样,通过传递参数给底层Clang,把框架头文件标记为系统级。
拆分目标,隔离框架警告
把第三方框架单独做成一个子Target,在这个子Target的构建设置里关闭Treat Warnings as Errors,主Target保持开启。这样框架的警告不会影响主项目的编译,还能单独处理框架的问题。调整头文件搜索路径
把第三方框架的头文件路径从Header Search Paths移到System Header Search Paths,系统路径下的头文件默认不会触发警告转错误的规则。
直接在Podfile里添加配置,批量处理所有第三方框架:
post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| # 关闭第三方框架的警告转错误 config.build_settings['GCC_TREAT_WARNINGS_AS_ERRORS'] = 'NO' config.build_settings['SWIFT_TREAT_WARNINGS_AS_ERRORS'] = 'NO' # 可选:添加特定警告忽略,比如废弃API警告 config.build_settings['OTHER_CFLAGS'] ||= [] config.build_settings['OTHER_CFLAGS'] << '-Wno-deprecated-declarations' end end end
执行pod install后,所有Pod的警告就不会影响主项目了。
内容的提问来源于stack exchange,提问作者wplong11

