SwiftMarch
Swift 發展趨勢喜人,Github 上已經有很多相關的開源項目,也有一些人進行了收集。然而我們如何判斷某個開源庫能否安心的在項目中使用呢?畢竟不是誰都有時間或者能力讀完全部的源碼,有些庫即使讀了源碼也無法立刻得出是是否可以大規模的應用。
因此,我們決定作出一點努力。我們會篩選出廣泛應用於實際 Swift 項目的開源庫,並且從一線開發者中搜集相關的評價。如果你打算開始一個 Swift 項目,希望這裡面的信息對你有幫助。
如果你覺得某個開源庫很棒而我們遺漏了可以開 PR 給我們,或者對我們公布的某些庫有獨到的評價可以通過 PR 告訴我們,我們會盡快處理。
加入我們
這是一個完全松散的組織,加入的條件很簡單:使用 Swift 開發的優秀程序員並且願意分享知識。我們有個 QQ 群,會在裡面交流在 Swift 開發遇到的各種問題。 加入方式在微博上私信發一段介紹給冰霜 @halffrost 或者 @Onetaway。
目錄
網絡
Alamofire
Swift 中使用最廣泛的網絡庫。由大神 matt 負責,值得信賴。可以看介紹:全身心擁抱開源的開發者 Mattt Thompson。需要提醒的是 4.1.0 的版本支持 iOS 8 , 4.0 的版本只支持 iOS 9 。
JSON 解析
SwiftyJSON
SwiftyJSON 應該算是最老牌的 JSON 解析庫之一,安全快捷又不啰嗦。知道的人多,用的人多,星星也多。對於嵌套復雜的 JSON 數據依然能夠如字典取值般簡單;靈活地與 if let 配合使用,更不用擔心取到了錯誤的數據。
ObjectMapper
JSON 解析是 iOS 開發中再常見不過的了,也許你只聽過上面星星很多的 SwiftyJSON,但是我相信你用過 ObjectMapper 後一定會喜歡上它的。首先 ObjectMapper 使用起來非常簡潔,配合 JSON Export 使用,你完全不需要在嵌套的 JSON 數據裡摸不著北,它還支持結構體和自定義轉換。同時,ObjectMapper 還遵守面向協議編程的范式,你的 Model 只需要實現 Mappable 協議就可以了,這會讓你的代碼更 Swifty。如果你想讓你的 Model 看起來既優雅又清爽,那麼我建議你一定要試一試這個庫。
這是 ObjectMapper 的中文文檔翻譯。
存儲
YYCache
輕量級緩存的最可靠選擇。不得不承認的一個事實是目前沒有一個用 Swift 編寫的優秀緩存庫。最流行的 Haneke 作者在 2.3 版本後已經放棄維護,當然本身 Haneke 的實現也不算優秀。雖然 OC 中的基本數據對象在 Swift 中使用需要經過類型轉換,但是經過實際測試這部分性能損失在日常業務處理中並沒有多大的影響,屬於可以接受的范圍。
具體設計介紹參考作者寫的:YYCache 設計思路與技術細節。
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:以一種優雅安全的方式使用資源文件。
SwiftyAttributes
先進的 API ,操作 attributed 字符串的利器。
加密
CryptoSwift
非常流行的加密解密庫,項目配有完善的單元測試,可以放心使用。
KeychainAccess
輕量級 Keychain 封裝,簡單到極致的接口。支持 TouchID 與 Keychain 整合,詳細、優雅、簡明的 README。Objective-C 版本在這裡
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會報出相應警告。當然為了方便和特殊情況,也可在相應代碼處手動關閉警告,或是在整個項目中關閉警告,十分靈活。
代碼規范請參考:Swift Style Guide
Thanks
awesome-ios