两周前WWDC2016发布当晚,就正式下载Xcode 8.0 Beta版本,正好最近梳理Swift语法,想尝试用Swift做一个小的Demo,其中就涉及使用到Swift版本的Auto Layout框架SnapKit. 但就在大概梳理整个文档之后,使用Carthage集成SnapKit到项目中一直出现一个很奇怪的编译错误:
Xcode: Module file was created by a newer version of the compiler
直到出发休年假前,这个问题一直困惑我很久,一直没找到对应的解决方案. Well,回到北京当晚,打开mac重新梳理清思路之后,这个问题终于得到解决. 顺带分享一下解决方案.
我的Mac上有两个版本的Xcode,一个是正式版7.3,另外一版本自然也就是8.0 Beta. WWDC上Apple官方发布Swift3.0版本,安装了8.0 Beta之后,Swift编译器版本就默认指向了3.0,可以打开命令行输入:
swift --version
查看Swift当前版本,结果会显示:
Apple Swift version 3.0 (swiftlang-802.0.18.2 clang-803.0.31)
显然当前Swift编译器版本是Swift 3.0,而SnapKit本身关于Swift 3.0版本还在迭代中,所以本身不是不支持3.0的. 这样会到通过Cathage引入SnapKit框架时,通过:
import SnapKit
一直会抱如上编译错误. 很明显这个问题源自于引入框架和当前Xcode 开发Swift编译器版本不符导致的,虽然Xcode 8.0 Beta一直提示支持在Swift 2.2 和 3.0版本之间进行切换,但其实并不好用. 虽然有人说stackoverfllow上提到一个比较简单粗暴但非常有效的解决方案,直接卸载Xcode 8.0 beta,但想想回头还要研究iOS10新特性,遂放弃了这个方案. 那有没有更好的解决方式呢? 答案是有.
当Mac中有多个Xcode版本,当打开工程的时候,通常会有一个默认配置,细心研究就会发现,如果安装一个Beta版本Xcode8.0,所有默认配置都默认指向当前最新版本Xcode配置,这里面也包含Swift编译器,可以通过如下命令在命令行中查看:
xcode-select -p
你会看到如下结果:
果不其然它默认指向了Xcode 8.0 Beta! Xcode 7.3 SDK默认打包的Swift 编译器版本是2.2,那如何降回来?使用如下命令:
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
然后重新通过xcode-select -p看默认指向xcode版本,结果如下:
你会发现,默认配置Xcode版本会重新指向正式版7.3,通过Swift --version命令重新查看一下Swiftb编译器版本也正如你所期,Swift编译器版本成功降回到2.2版本.
这时通过Carthage重新引入SnapKit框架:
整个SnapKit框架Building成功,把iOS的Framework引入Porject中,重新Rebuild你会发现刚开始那个错误完全消失了,编译通过,问题解决.
当前Swift 3.0 发布不久,相对于之前2.3版本变动并不是特别大,现在Swift第三方库在Github上也日渐增多,但并不是所有Framework都能及时更新支持到最新的Swift版本,所以正式生产环境来说,为了稳定性,基本毫无疑问基本不会考虑3.0.
这里顺带提一下我在Github看到一些关于Swift一些比较开源库集合贴,重点推荐awesome swift,基本囊括了目前Swift项目开发方方面面,高效率选择合适的开源项目,从而更多地专注于自己项目本身,会有很大帮助. 当然国内开发者也做了一个中文推荐第三方库集合贴SwiftGuide,也是非常值得参考. 如上两个集合贴都只是坐了索引,其实很多重要的库你会发现可能也会找不到,比如SnapKit, 切随着Swift 3.0版本发布,集合贴中设计库支持的Swift版本并没有说明,需要开发者自己去甄别选择. 当然如果你有好的第三方库推荐,不妨在issue中推荐给作者. btw,如果你不需要开发过程用到iOS 10新特性,目前来说还是不推荐安装Xcode 8.0 Beta版本.