項目升級到 Swift3.0

swift2.2 升級到 swift3.0

第三方庫的升級

爲了開發方便,我用到了很多第三方庫,且慵懶的使用了Cocoapods 1.0.0 進行第三方庫管理。下面是我的Podfile.lock 部分內容:

  - 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 後打開項目會是怎麼樣的一幅場景。說實話剛打開的時候整個人都不好了,感覺世界就在那一刻完全崩塌。不過好在這些項目中大部分作者已經及時適配了swift3.0(對於OC寫的庫可以不用考慮)
下面簡單說說升級第三方庫。最簡單粗的做法

pod update --verbose //加上參數是爲了查看更新詳情

操作完這一步,觀察 Podfile.lock 發現 Alamofire 變成了 3.4.1 其他的幾個庫也只是增加了一個版本號,升級沒有成功
嘗試多次 pod update,其中幾次還報了錯。查看後發現需要升級spec

pod repo update

之後再進行 pod update 即可將大部分第三方庫升級到最新版本。這裏要說明一下,我的 Podfile 文件中 pod 都沒有指定版本,這樣才能在 pod update 的時候直接加載最新的庫。也許你會問,當多人開發的時候,大家在本地 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 發生了變化。
參考 How to get localizedstring for CNLabeledValue in swift3

2、應用跳轉到設置界面

// 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、關於 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 的風格。這裏需要注意的就是 @escaping 關鍵字。
另外也有網友對GCD的變化做了舉例,感興趣可以看看 Swift 3 裏的 GCD

關於 Xcode 8

Xcode 8 爲我們帶來了很多新的特性,讓我們的開發進一步方便的同時,也默認開啓了很多功能。但有些功能卻讓我們着實感到困惑,比如,在我們調試程序的時候默認會打印很多系統的 log,這些 log 並不是我們關心的內容。那該如何關閉她呢?

Product -> Scheme -> Edit Scheme

然後你就看到下面的界面,配置上去就可以了。值得說一下的是,上面的那個是取消系統 log 的打印;下面的是打印應用啓動過程中,各種組件的啓動時間。


to be continue ...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章