1. 程式人生 > >最常用的 Swift 開源庫

最常用的 Swift 開源庫

關於我們

SwiftOldDriver 是剛剛成立的一個 Swift 開發者聚賢地,這個名字意為中文的老司機,沒錯,老司機這就來帶你了。歡迎廣大 Swift 開發者一起前來學習交流。

微博 @SwiftOldDriver ;

微信公眾號 SwiftOldDriver ;

GitHub:SwiftOldDriver 。

這個組織的目標是通過彙集優秀一線開發者分享的知識,讓大家在 Swift 的程式設計道路上走的更平坦一些。

我們想到的第一件事就是將經典常用的開源庫的收集起來,然後圍繞這些優秀被廣泛使用的開源庫進行中文文件翻譯並且分享最佳實踐和原始碼解讀。這個收集的 github 名稱為:SwiftOldDriver/SwiftMarch 。也可以通過點選閱讀原文後跳轉。取名 March ,我們的目標是星辰大海。

Swift 發展趨勢喜人,Github 上已經有很多相關的開源專案,也有一些人進行了收集。然而我們如何判斷某個開源庫能否安心的在專案中使用呢?畢竟不是誰都有時間或者能力讀完全部的原始碼,有些庫即使讀了原始碼也無法立刻得出是是否可以大規模的應用。

因此,我們決定作出一點努力。我們會篩選出廣泛應用於實際 Swift 專案的開源庫,並且從一線開發者中搜集相關的評價。如果你打算開始一個 Swift 專案,希望這裡面的資訊對你有幫助。

網路


Alamofire

Swift 中使用最廣泛的網路庫。由大神 matt 負責,值得信賴。可以看介紹:全身心擁抱開源的開發者 Mattt Thompson。稍微有點遺憾的是官方的 Swift 3.0 版本響應蘋果的號召並不支援 iOS 8。只有 2.3 的版本才支援 iOS 8。

JSON 解析

SwiftyJSON

SwiftyJSON 應該算是最老牌的 JSON 解析庫之一,安全快捷又不囉嗦。知道的人多,用的人多,星星也多。對於巢狀複雜的 JSON 資料依然能夠如字典取值般簡單;靈活地與 if let 配合使用,更不用擔心取到了錯誤的資料。

ObjectMapper

JSON 解析是 iOS 開發中再常見不過的了,也許你只聽過上面星星很多的 SwiftyJSON,但是我相信你用過 ObjectMapper 後一定會喜歡上它的。首先 ObjectMapper 使用起來非常簡潔,配合 JSON Export 使用,你完全不需要在巢狀的 JSON 資料裡摸不著北,它還支援結構體和自定義轉換。同時,ObjectMapper 還遵守面向協議程式設計的正規化,你的 Model 只需要實現 Mappable 協議就可以了,這會讓你的程式碼更 Swifty。如果你想讓你的 Model 看起來既優雅又清爽,那麼我建議你一定要試一試這個庫。

儲存


Realm  

Realm 是由矽谷創業公司釋出的一款可以用於 iOS 和 Android 的跨平臺移動資料庫。支援的平臺包括 Java,Objective-C,Swift,React Native,Xamarin。是第一個專門針對移動平臺的資料庫,立志取代 SQLite 、CoreData。核心資料引擎由 C++ 開發,有著優異的效能。簡單易用可以快速上手,在資料儲存時再也不用思考煩人的底層技術細節。

基於技術選型的限制,目前 Realm 使用中也有一些明顯的不便:

  • Realm 沒有自動增長屬性

    Realm 沒有執行緒/程序安全的自動增長屬性機制,這在其他資料庫中常常用來產生主鍵

  • 所有的資料模型必須直接繼承自 RealmObject 。這阻礙我們利用資料模型中的任意型別的繼承。以下是不能完成的:

    • 多型類之間的轉換(例如子類轉換成子類,子類轉換成父類,父類轉換成子類等)

    • 同時對多個類進行檢索

    • 多類容器 (RLMArray 以及 RLMResults)

  • NSData 以及 NSString 屬性不能儲存超過 16 MB 大小的資料

  • 不能自定義 getter、setter

      realm會自動生成 getter、setter ,如果自定義 getter 、setter 儲存就會有影響。如果要規避這個問題,可以通過設定這個物件的忽略屬性。
  • 查詢的結果不是陣列

     為了能夠支援查詢結果的鏈式查詢,realm 自定義了一個集合型別。可以列舉,但是不是熟悉的陣列了。又因為realm的懶載入機制,所以不建議在資料層把這個列舉轉成陣列型別。這樣的缺點就是上層知道了資料的儲存邏輯。嚴格的說這裡不應該讓上層知道。但是這樣設計也許是為了方便上層進行再次檢索,realm有著優越的查詢效能。
  • 儘管 Realm 檔案可以被多個執行緒同時訪問,但是您不能跨執行緒處理 Realms、Realm 物件、查詢和查詢結果

  • Realm不能支援原生的集合型別,比如:NSArray 、NSDictionary 、NSSet 等。需要使用 Realm 裡面提供的集合型別 RLMArray(OC),List(Swift)

關於 Realm 的基本情況介紹,可以看這篇文章:移動端資料庫新王者:realm。

關於 Realm 的詳細使用,可以檢視官方文件。

更多的具體分析,請前往Realm資料庫 從入門到“放棄”。

圖片儲存


Kingfisher  

Kingfisher 是 Swift 中使用比較廣泛的圖片儲存庫。由喵神 onevcat 開源及維護。 Kingfisher 輕量級,純 Swift 編寫,目的是為了解決從網路上下載圖片和快取圖片的問題。Kingfisher 的靈感主要來源於 SDWebImage,採用的儲存機制和 SDWebImage一樣,所以效能上沒有太大區別,然而卻有著更加靈活友好的 API。

目前支援 iOS 8.0+ / macOS 10.10+ / tvOS 9.0+ / watchOS 2.0+,Swift 3 (Kingfisher 3.x), Swift 2.3 (Kingfisher 2.x)。

關於 Kingfisher 的使用,詳細請看這篇文件。

佈局


SnapKit

如果你使用 Autolayout 佈局,Snapkit 就是最好的第三方庫。完整的提供了底層的能力。創造性的引入鏈式程式設計,讓使用起來非常的方便。

UI

Reusable

UITableView 必備。更加優雅的實現 Cell 的 Register 和 Reuse 。使用參考:Reusable-讓你放肆的dequeueReusableCell。

Util


SwiftDate

非常好用的幫助處理 Date 相關的庫。靈活運用了 swift 的過載操作符、擴充套件等特性,使得時間可以直觀的進行算術運算:比較大小,直接加減等。常見的時間也字串的轉換也做了良好的支援。

MonkeyKing

MonkeyKing 幫助開發者快速整合國內主流社交應用(微信、微博、QQ、支付寶)的分享、授權、支付等功能。重要的是,不需要整合各種官方 SDK。目前由 4 名程式設計師維護。可用於生產環境、輕量級,能滿足絕大部分的分享、授權、支付等需求。


EZSwiftExtensions

提供了一系列對於 Swift 標準庫、方法與 UIKit 的擴充套件,讓你更加簡單舒服地編寫程式碼。

R.swift

配置稍微有一點複雜,然而付出的努力對於專案而言是值得的。R.swfit 會根據專案檔案在編譯期生成各種資原始檔的列舉,比如 nib 、UIImage 等。大幅度減少了使用資原始檔時輸入字串的這種痛苦。有一個缺點就是這個庫只適合使用在純 Swift 專案中。可以參考:R.swift:以一種優雅安全的方式使用資原始檔。

加密

CryptoSwift

非常流行的加密解密庫,專案配有完善的單元測試,可以放心使用。

Debug


XCGLogger

由於 Swift 本身不包含 C 的預編譯器,導致開發者不能使用在 OC 中定義過的巨集定義進行除錯列印。簡單的列印呼叫棧的資訊,又會漏掉很多有用資訊。想要解決這個問題又需要加入更多的程式碼。基於這個目的, XCGLogger 給純的 Swift 專案帶來了解決方案。 XCGLogger 允許你在控制檯記錄任何細節,使用起來極其簡單,和使用 nslog() 或 print() 一樣方便。 XCGLogger 可以列印任何資訊,甚至可以列印日期、函式名、檔名和行號等等。


CocoaLumberjack

OC 時代最好用的記錄日誌的開源庫。現在同時有 OC 版和 swift 版本提供。

自動化


Fastlane

iOS 中最好用的自動化工具。提供了獲取證書、執行自動化測試、上傳至 TestFlight 和 AppStore 等功能。配置簡單,社群強大,具體的功能可以到這個網站檢視:fastlane.tools。

Functional Reactive Programming

使用響應式程式設計框架統一對委託、回撥 blocks 、通知 、控制元件的事件 、KVO 等非同步事件的邏輯處理。可以顯著的降低程式碼複雜度,更有效的傳達程式碼意圖。任何一個優秀的 iOS 程式設計師都不會拒絕響應式程式設計,唯一的缺點可能就是對智商有要求了。

RAC 和 Rx 都有著廣泛的使用使用者。個人拙見兩個庫的選擇全靠個人偏好,在程式設計正規化上沒有區別。


ReactiveCocoa

OC 時代最流行的響應式框架。由 github 團隊開源。如果專案是從 OC 遷移到 swift 的,繼續使用 RAC 是一個非常自然的選擇。因此 RAC 有著廣泛的社群支援。從 5.0 開始主要框架邏輯已經全由 swift 實現。與 RxSwift 程式設計模型最大的區別是冷熱訊號由兩種型別表示。


RxSwift

函式響應式程式設計 (Funtional Reactive Programming) 系列 ReactiveX 的 Swift 版本開源框架。推出時間較晚,其思路與 ReactiveCocoa 相近,它們的共同祖先是微軟的 ReactiveExtensions,本質核心就是面向資料流程式設計。

程式碼分析


SwiftLint

Realm 出品的 Swift 程式碼規範檢測工具。深度嵌入 Clang 和 SourceKit,可以監測整個專案的程式碼風格。如果有不符合規範之處,SwiftLint會報出相應警告⚠️。當然為了方便和特殊情況,也可在相應程式碼處手動關閉警告,或是在整個專案中關閉警告,十分靈活。