簡介
xcode8.3之后就只能支持swift3.0以上了葱弟,在上個(gè)版本做完后褐啡,我就開始做代碼升級(jí),在此記錄一下過程奉狈。
關(guān)于安裝兩個(gè)xcode
由于怕出問題卤唉,我準(zhǔn)備開一個(gè)分支,并且另外安裝一個(gè)xcode8.3仁期,畢竟不是只有這一個(gè)項(xiàng)目桑驱。關(guān)于安裝兩個(gè)xcode有兩點(diǎn)要注意一下:
1.避免重名,安裝第二的時(shí)候改下xcode名字如Xcode8.3這樣跛蛋;
2.編譯選擇的xcode熬的,在命令行(Terminal )敲入sudo xcode-select -s /Applications/Xcode8.3.app
這樣,最后一個(gè)就是選擇的xcode名字赊级。
流程
首先呢用Xcode8.3打開工程押框,然后xcode自動(dòng)檢測到會(huì)提示你convert,先讓xcode自動(dòng)修改理逊。
然后把工程用到的第三方庫更新橡伞,用cocoapod更新或者直接到github上下載,我這邊因?yàn)槭莖c和swift混用的晋被,只用到了ObjectMapper和SnapKit兑徘。
最后就開始最主要的修改代碼了,有很多是xcode沒有修改正確的地方羡洛,我這邊就有300多紅點(diǎn)挂脑,當(dāng)時(shí)第一反應(yīng)是蒙蔽的:(哭
相關(guān)問題
1.關(guān)于AnyObject和Any,AnyObject只能表示class類型對(duì)象欲侮,相當(dāng)于oc中的id崭闲。但在swift中,例如string锈麸、Array等都變成了結(jié)構(gòu)體镀脂,到了swift3中就有更多的類變成結(jié)構(gòu)體了牺蹄,這時(shí)之前用AnyObject表示的現(xiàn)在都需要改成Any忘伞。
2.有一個(gè)CGFloat.max
是用在動(dòng)態(tài)計(jì)算文本長度(NSString的boundingRectWithSize)的地方,現(xiàn)在改成了CGFloat.greatestFiniteMagnitude
。
3.在oc中有時(shí)候需要檢測對(duì)象類型氓奈,oc中的寫法[xxx class]
,在之前啊swift中也是直接用類名來表示翘魄,而在swift3中是xxx.classForCoder()
。
4.在一個(gè)延遲執(zhí)行中舀奶,添加了DispatchTime類型暑竟,一種創(chuàng)建方法.now()+.milliseconds(1000)
這個(gè)1000的單位是毫秒(ms)。
5.創(chuàng)建通知時(shí)的通知名不能再直接用字符串育勺,而是要用NSNotification.Name()
的方式創(chuàng)建但荤。
6.關(guān)于for循環(huán)的用法:
oc風(fēng)格的for var i = 0 ; i < count ; i++ {}
swift風(fēng)格的for i in 0 ..< count {}
7.關(guān)于圖片的64位編碼,我們的程序之前是用了一個(gè)GTMBase64的第三方庫做的涧至,在swift3中報(bào)錯(cuò)了腹躁,然后我看了下在Data中有一個(gè)base64EncodedString()方法,試了下也沒問題南蓬。
總結(jié)
修改完代碼以后纺非,我仔細(xì)想了一下,最主要的問題還是swift對(duì)類型要盡量嚴(yán)格定義赘方,在獲取云端json數(shù)據(jù)時(shí)會(huì)有不確定性烧颖,自己解析就會(huì)比較麻煩還會(huì)遇到許多問題,盡量還是使用SwiftyJSON這樣完善的第三方庫進(jìn)行處理窄陡。