简介
xcode8.3之后就只能支持swift3.0以上了,在上个版本做完后,我就开始做代码升级,在此记录一下过程。
关于安装两个xcode
由于怕出问题,我准备开一个分支,并且另外安装一个xcode8.3,毕竟不是只有这一个项目。关于安装两个xcode有两点要注意一下:
1.避免重名,安装第二的时候改下xcode名字如Xcode8.3这样;
2.编译选择的xcode,在命令行(Terminal )敲入sudo xcode-select -s /Applications/Xcode8.3.app
这样,最后一个就是选择的xcode名字。
流程
首先呢用Xcode8.3打开工程,然后xcode自动检测到会提示你convert,先让xcode自动修改。
然后把工程用到的第三方库更新,用cocoapod更新或者直接到github上下载,我这边因为是oc和swift混用的,只用到了ObjectMapper和SnapKit。
最后就开始最主要的修改代码了,有很多是xcode没有修改正确的地方,我这边就有300多红点,当时第一反应是蒙蔽的:(哭
相关问题
1.关于AnyObject和Any,AnyObject只能表示class类型对象,相当于oc中的id。但在swift中,例如string、Array等都变成了结构体,到了swift3中就有更多的类变成结构体了,这时之前用AnyObject表示的现在都需要改成Any。
2.有一个CGFloat.max
是用在动态计算文本长度(NSString的boundingRectWithSize)的地方,现在改成了CGFloat.greatestFiniteMagnitude
。
3.在oc中有时候需要检测对象类型,oc中的写法[xxx class]
,在之前啊swift中也是直接用类名来表示,而在swift3中是xxx.classForCoder()
。
4.在一个延迟执行中,添加了DispatchTime类型,一种创建方法.now()+.milliseconds(1000)
这个1000的单位是毫秒(ms)。
5.创建通知时的通知名不能再直接用字符串,而是要用NSNotification.Name()
的方式创建。
6.关于for循环的用法:
oc风格的for var i = 0 ; i < count ; i++ {}
swift风格的for i in 0 ..< count {}
7.关于图片的64位编码,我们的程序之前是用了一个GTMBase64的第三方库做的,在swift3中报错了,然后我看了下在Data中有一个base64EncodedString()方法,试了下也没问题。
总结
修改完代码以后,我仔细想了一下,最主要的问题还是swift对类型要尽量严格定义,在获取云端json数据时会有不确定性,自己解析就会比较麻烦还会遇到许多问题,尽量还是使用SwiftyJSON这样完善的第三方库进行处理。