swift2.2 升級到 swift3.0
第三方庫的升級
為了開發(fā)方便权均,我用到了很多第三方庫垛叨,且慵懶的使用了Cocoapods 1.0.0 進行第三方庫管理坏瘩。下面是我的Podfile.lock 部分內(nèi)容:
- Alamofire (3.4.0)
- Dollar (5.0.1)
- IBAnimatable (2.2)
- IQKeyboardManagerSwift (4.0.3)
- KeychainAccess (2.3.5)
- Kingfisher (2.4.1)
- MJRefresh (3.1.5)
- ObjectMapper (1.3.0)
- Realm (1.0.0):
- Realm/Headers (= 1.0.0)
- Realm/Headers (1.0.0)
- RealmSwift (1.0.0):
- Realm (= 1.0.0)
- SVProgressHUD (2.0.3)
- SwiftyJSON (2.3.2)
- UIColor_Hex_Swift (2.1)
可想而知升級完 Xcode8 后打開項目會是怎么樣的一幅場景介牙。說實話剛打開的時候整個人都不好了银受,感覺世界就在那一刻完全崩塌圈膏。不過好在這些項目中大部分作者已經(jīng)及時適配了swift3.0(對于OC寫的庫可以不用考慮)
下面簡單說說升級第三方庫塔猾。最簡單粗的做法
pod update --verbose //加上參數(shù)是為了查看更新詳情
操作完這一步,觀察 Podfile.lock 發(fā)現(xiàn) Alamofire 變成了 3.4.1 其他的幾個庫也只是增加了一個版本號稽坤,升級沒有成功
嘗試多次 pod update丈甸,其中幾次還報了錯。查看后發(fā)現(xiàn)需要升級spec
pod repo update
之后再進行 pod update 即可將大部分第三方庫升級到最新版本尿褪。這里要說明一下睦擂,我的 Podfile 文件中 pod 都沒有指定版本,這樣才能在 pod update 的時候直接加載最新的庫杖玲。也許你會問顿仇,當多人開發(fā)的時候,大家在本地 pod install ,很可能會引用不同版本的庫臼闻。這個我倒不擔心鸿吆,因為這不還有 Podfile.lock 在么。只要你別亂 pod update 就行述呐。
事實證明也有例外惩淳,更新后 Alamofire 被默認指定為 3.5(支持swift2.3) ,需要手動指定它的版本為 4.0 (支持swift3) 市埋。另外需要修改 platform :ios, '9.0'黎泣,否則你會看到錯誤
最后就是要在 pods -> TARGETS(第三方庫) -> Build Settings 中找到 User Legacy Swift Language Version 修改為 Yes/No
本地代碼升級
1、CNLabeledValue 發(fā)生了變化缤谎。
參考 How to get localizedstring for CNLabeledValue in swift3
2抒倚、應(yīng)用跳轉(zhuǎn)到設(shè)置界面
// Swift 2.2
let bundleid = "xxxx" // Bundle Identifier
let url = URL(string: "prefs:root=\(bundleid)")
UIApplication.shared.openURL(url!)
// Swift 3.0
UIApplication.shared.openURL(URL(string: UIApplicationOpenSettingsURLString)!)
3、關(guān)于 GCD 的變化
沒有什么比直接上代碼更具有說服力坷澡。
// switch 3.0 后寫法
func dispatch_async_wrapper(_ async_block: @escaping ()->(), update_ui_block: @escaping ()->()) {
DispatchQueue.global().async(execute: {
// 異步耗時操作
async_block()
DispatchQueue.main.async(execute: {
// 更新UI
update_ui_block()
})
})
}
// swift 2.2
func dispatch_async_wrapper(async_block: ()->(), update_ui_block: ()->()) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),{
// 異步耗時操作
async_block()
dispatch_async(dispatch_get_main_queue(), {
// 更新UI
update_ui_block()
})
})
}
可以清楚的看到 apple 對 GCD 的類名稱做了修改托呕,使他更符合 swift 的風(fēng)格。這里需要注意的就是 @escaping 關(guān)鍵字频敛。
另外也有網(wǎng)友對GCD的變化做了舉例项郊,感興趣可以看看 Swift 3 里的 GCD
關(guān)于 Xcode 8
Xcode 8 為我們帶來了很多新的特性,讓我們的開發(fā)進一步方便的同時斟赚,也默認開啟了很多功能着降。但有些功能卻讓我們著實感到困惑,比如拗军,在我們調(diào)試程序的時候默認會打印很多系統(tǒng)的 log任洞,這些 log 并不是我們關(guān)心的內(nèi)容。那該如何關(guān)閉她呢发侵?
Product -> Scheme -> Edit Scheme
然后你就看到下面的界面交掏,配置上去就可以了。值得說一下的是刃鳄,上面的那個是取消系統(tǒng) log 的打又殉凇;下面的是打印應(yīng)用啟動過程中叔锐,各種組件的啟動時間挪鹏。
to be continue ...