Swift 4.1中使用#if canImport仍无法实现IceCream框架条件导入?
我之前也碰到过一模一样的情况——明明已经把IceCream设为可选框架,也加了canImport的条件检查,结果还是弹出“Modules deployment target is iOS10”的编译错误,折腾了好一会儿才搞清楚缺了这几个关键配置:
调整IceCream框架自身的部署目标(手动导入场景)
如果你是手动添加的IceCream.framework,选中它之后到右侧Build Settings里找到iOS Deployment Target,把它改成和你的项目一致的iOS 9.0。因为框架默认的部署目标可能是iOS10,哪怕你项目设的是9,框架这边没同步改的话,编译时还是会触发版本冲突。CocoaPods专属配置(用Pod导入场景)
要是你用CocoaPods引入IceCream,得在Podfile里加一段配置,强制把它的部署目标降到iOS9:pod 'IceCream', :modular_headers => true post_install do |installer| installer.pods_project.targets.each do |target| if target.name == 'IceCream' target.build_configurations.each do |config| config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '9.0' end end end end写完后执行
pod install重新安装,这样Pod就会帮你把IceCream的部署目标改成兼容iOS9的版本,配合你的条件导入就能正常编译了。确认项目的模块启用开关
去项目的Build Settings里找CLANG_ENABLE_MODULES(也就是Enable Modules),确保它设为YES。这个开关是Swift的canImport指令正常工作的前提,要是关了的话,条件导入相当于没生效,还是会触发框架的版本检查。彻底隔离IceCream的调用代码
除了导入语句,所有用到IceCream的代码逻辑都得放在#if canImport(IceCream)的代码块里,比如:#if canImport(IceCream) func setupRealmCloudSync() { // 这里写IceCream相关的同步逻辑 CloudKitAdapter.setup(with: realm) } #endif不然哪怕导入部分条件化了,调用代码在iOS9环境下还是会找不到对应符号,要么编译出错要么运行崩溃。
最后记得Clean一下项目(Cmd+Shift+K)再重新编译,有时候Xcode的缓存会导致配置没及时生效哦。
内容的提问来源于stack exchange,提问作者Imran

