Swift 發(fā)展趨勢喜人肋杖,Github 上已經(jīng)有很多相關的開源項目永罚,也有一些人進行了收集。然而我們如何判斷某個開源庫能否安心的在項目中使用呢宋舷?畢竟不是誰都有時間或者能力讀完全部的源碼,有些庫即使讀了源碼也無法立刻得出是是否可以大規(guī)模的應用瓢姻。
因此祝蝠,我們決定作出一點努力。我們會篩選出廣泛應用于實際 Swift 項目的開源庫幻碱,并且從一線開發(fā)者中搜集相關的評價绎狭。如果你打算開始一個 Swift 項目,希望這里面的信息對你有幫助褥傍。
如果你覺得某個開源庫很棒而我們遺漏了可以開 PR 給我們儡嘶,或者對我們公布的某些庫有獨到的評價可以通過 PR 告訴我們,我們會盡快處理恍风。
網(wǎng)絡
Alamofire
Swift 中使用最廣泛的網(wǎng)絡庫蹦狂。由大神 matt 負責誓篱,值得信賴】ǎ可以看介紹:全身心擁抱開源的開發(fā)者 Mattt Thompson窜骄。需要提醒的是 4.1.0 的版本支持 iOS 8 , 4.0 的版本只支持 iOS 9 摆屯。
JSON 解析
SwiftyJSON
SwiftyJSON 應該算是最老牌的 JSON 解析庫之一邻遏,安全快捷又不啰嗦。知道的人多虐骑,用的人多党远,星星也多。對于嵌套復雜的 JSON 數(shù)據(jù)依然能夠如字典取值般簡單富弦;靈活地與 if let
配合使用沟娱,更不用擔心取到了錯誤的數(shù)據(jù)。
ObjectMapper
JSON 解析是 iOS 開發(fā)中再常見不過的了腕柜,也許你只聽過上面星星很多的 SwiftyJSON济似,但是我相信你用過 ObjectMapper 后一定會喜歡上它的。首先 ObjectMapper 使用起來非常簡潔盏缤,配合 JSON Export 使用砰蠢,你完全不需要在嵌套的 JSON 數(shù)據(jù)里摸不著北,它還支持結構體和自定義轉換唉铜。同時台舱,ObjectMapper 還遵守面向協(xié)議編程的范式,你的 Model 只需要實現(xiàn) Mappable 協(xié)議就可以了潭流,這會讓你的代碼更 Swifty竞惋。如果你想讓你的 Model 看起來既優(yōu)雅又清爽,那么我建議你一定要試一試這個庫灰嫉。
這是 ObjectMapper 的中文文檔翻譯拆宛。
存儲
YYCache
輕量級緩存的最可靠選擇。不得不承認的一個事實是目前沒有一個用 Swift 編寫的優(yōu)秀緩存庫讼撒。最流行的 Haneke 作者在 2.3 版本后已經(jīng)放棄維護浑厚,當然本身 Haneke 的實現(xiàn)也不算優(yōu)秀。雖然 OC 中的基本數(shù)據(jù)對象在 Swift 中使用需要經(jīng)過類型轉換根盒,但是經(jīng)過實際測試這部分性能損失在日常業(yè)務處理中并沒有多大的影響钳幅,屬于可以接受的范圍。
具體設計介紹參考作者寫的:YYCache 設計思路與技術細節(jié)炎滞。
Realm
Realm 是由硅谷創(chuàng)業(yè)公司發(fā)布的一款可以用于 iOS 和 Android 的跨平臺移動數(shù)據(jù)庫敢艰。支持的平臺包括 Java,Objective-C厂榛,Swift盖矫,React Native,Xamarin击奶。是第一個專門針對移動平臺的數(shù)據(jù)庫辈双,立志取代 SQLite 、CoreData柜砾。核心數(shù)據(jù)引擎由 C++ 開發(fā)湃望,有著優(yōu)異的性能。簡單易用可以快速上手痰驱,在數(shù)據(jù)存儲時再也不用思考煩人的底層技術細節(jié)证芭。
基于技術選型的限制,目前 Realm 使用中也有一些明顯的不便:
-
Realm 沒有自動增長屬性
Realm 沒有線程/進程安全的自動增長屬性機制担映,這在其他數(shù)據(jù)庫中常常用來產(chǎn)生主鍵
-
所有的數(shù)據(jù)模型必須直接繼承自 RealmObject 废士。這阻礙我們利用數(shù)據(jù)模型中的任意類型的繼承。以下是不能完成的:
- 多態(tài)類之間的轉換(例如子類轉換成子類蝇完,子類轉換成父類官硝,父類轉換成子類等)
- 同時對多個類進行檢索
- 多類容器 (RLMArray 以及 RLMResults)
NSData 以及 NSString 屬性不能保存超過 16 MB 大小的數(shù)據(jù)
-
不能自定義 getter、setter
realm會自動生成 getter短蜕、setter 氢架,如果自定義 getter 、setter 存儲就會有影響朋魔。如果要規(guī)避這個問題岖研,可以通過設置這個對象的忽略屬性。
-
查詢的結果不是數(shù)組
為了能夠支持查詢結果的鏈式查詢警检,realm 自定義了一個集合類型孙援。可以枚舉扇雕,但是不是熟悉的數(shù)組了赃磨。又因為realm的懶加載機制,所以不建議在數(shù)據(jù)層把這個枚舉轉成數(shù)組類型洼裤。這樣的缺點就是上層知道了數(shù)據(jù)的存儲邏輯邻辉。嚴格的說這里不應該讓上層知道。但是這樣設計也許是為了方便上層進行再次檢索腮鞍,realm有著優(yōu)越的查詢性能值骇。
盡管 Realm 文件可以被多個線程同時訪問,但是您不能跨線程處理 Realms移国、Realm 對象吱瘩、查詢和查詢結果
Realm不能支持原生的集合類型,比如:NSArray 迹缀、NSDictionary 使碾、NSSet 等蜜徽。需要使用 Realm 里面提供的集合類型 RLMArray(OC),List(Swift)
關于 Realm 的基本情況介紹票摇,可以看這篇文章:移動端數(shù)據(jù)庫新王者:realm拘鞋。
關于 Realm 的詳細使用,可以查看官方文檔矢门。
更多的具體分析盆色,請前往Realm數(shù)據(jù)庫 從入門到“放棄”。
圖片存儲
Kingfisher
Kingfisher 是 Swift 中使用比較廣泛的圖片存儲庫祟剔。由喵神 onevcat 開源及維護隔躲。 Kingfisher 輕量級,純 Swift 編寫物延,目的是為了解決從網(wǎng)絡上下載圖片和緩存圖片的問題宣旱。Kingfisher 的靈感主要來源于 SDWebImage,采用的存儲機制和 SDWebImage一樣叛薯,所以性能上沒有太大區(qū)別响鹃,然而卻有著更加靈活友好的 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 就是最好的第三方庫。完整的提供了底層的能力城舞。創(chuàng)造性的引入鏈式編程轩触,讓使用起來非常的方便。
UI
Reusable
UITableView 必備家夺。更加優(yōu)雅的實現(xiàn) Cell 的 Register 和 Reuse 脱柱。使用參考:Reusable-讓你放肆的dequeueReusableCell。
Util
SwiftDate
非常好用的幫助處理 Date 相關的庫拉馋。靈活運用了 swift 的重載操作符榨为、擴展等特性,使得時間可以直觀的進行算術運算:比較大小煌茴,直接加減等随闺。常見的時間也字符串的轉換也做了良好的支持。
MonkeyKing
MonkeyKing 幫助開發(fā)者快速集成國內主流社交應用(微信蔓腐、微博矩乐、QQ、支付寶)的分享回论、授權散罕、支付等功能分歇。重要的是,不需要集成各種官方 SDK欧漱。目前由 4 名程序員維護职抡。可用于生產(chǎn)環(huán)境硫椰、輕量級,能滿足絕大部分的分享萨蚕、授權靶草、支付等需求。
EZSwiftExtensions
提供了一系列對于 Swift 標準庫岳遥、方法與 UIKit 的擴展奕翔,讓你更加簡單舒服地編寫代碼。
R.swift
配置稍微有一點復雜浩蓉,然而付出的努力對于項目而言是值得的派继。R.swfit 會根據(jù)項目文件在編譯期生成各種資源文件的枚舉,比如 nib 捻艳、UIImage 等驾窟。大幅度減少了使用資源文件時輸入字符串的這種痛苦。有一個缺點就是這個庫只適合使用在純 Swift 項目中认轨∩鹇纾可以參考:R.swift:以一種優(yōu)雅安全的方式使用資源文件。
SwiftyAttributes
先進的 API 嘁字,操作 attributed 字符串的利器恩急。
加密
CryptoSwift
非常流行的加密解密庫,項目配有完善的單元測試纪蜒,可以放心使用衷恭。
KeychainAccess
輕量級 Keychain 封裝,簡單到極致的接口。支持 TouchID 與 Keychain 整合纯续,詳細随珠、優(yōu)雅、簡明的 README猬错。Objective-C 版本在這里
Debug
XCGLogger
由于 Swift 本身不包含 C 的預編譯器牙丽,導致開發(fā)者不能使用在 OC 中定義過的宏定義進行調試打印。簡單的打印調用棧的信息兔魂,又會漏掉很多有用信息烤芦。想要解決這個問題又需要加入更多的代碼∥鲂#基于這個目的构罗, XCGLogger 給純的 Swift 項目帶來了解決方案铜涉。 XCGLogger 允許你在控制臺記錄任何細節(jié),使用起來極其簡單遂唧,和使用 nslog() 或 print() 一樣方便芙代。 XCGLogger 可以打印任何信息,甚至可以打印日期盖彭、函數(shù)名纹烹、文件名和行號等等。
CocoaLumberjack
OC 時代最好用的記錄日志的開源庫≌俦撸現(xiàn)在同時有 OC 版和 swift 版本提供铺呵。
自動化
Fastlane
iOS 中最好用的自動化工具。提供了獲取證書隧熙、運行自動化測試片挂、上傳至 TestFlight 和 AppStore 等功能。配置簡單贞盯,社區(qū)強大音念,具體的功能可以到這個網(wǎng)站查看:fastlane.tools。
Functional Reactive Programming
使用響應式編程框架統(tǒng)一對委托躏敢、回調 blocks 闷愤、通知 、控件的事件 件余、KVO 等異步事件的邏輯處理肝谭。可以顯著的降低代碼復雜度蛾扇,更有效的傳達代碼意圖攘烛。任何一個優(yōu)秀的 iOS 程序員都不會拒絕響應式編程,唯一的缺點可能就是對智商有要求了镀首。
RAC 和 Rx 都有著廣泛的使用用戶坟漱。個人拙見兩個庫的選擇全靠個人偏好,在編程范式上沒有區(qū)別更哄。
ReactiveCocoa
OC 時代最流行的響應式框架芋齿。由 github 團隊開源。如果項目是從 OC 遷移到 swift 的成翩,繼續(xù)使用 RAC 是一個非常自然的選擇觅捆。因此 RAC 有著廣泛的社區(qū)支持。從 5.0 開始主要框架邏輯已經(jīng)全由 swift 實現(xiàn)麻敌。與 RxSwift 編程模型最大的區(qū)別是冷熱信號由兩種類型表示栅炒。
RxSwift
函數(shù)響應式編程 (Funtional Reactive Programming) 系列 ReactiveX 的 Swift 版本開源框架。推出時間較晚,其思路與 ReactiveCocoa 相近赢赊,它們的共同祖先是微軟的 ReactiveExtensions乙漓,本質核心就是面向數(shù)據(jù)流編程。
代碼分析
SwiftLint
Realm 出品的 Swift 代碼規(guī)范檢測工具释移。深度嵌入 Clang 和 SourceKit叭披,可以監(jiān)測整個項目的代碼風格。如果有不符合規(guī)范之處玩讳,SwiftLint會報出相應警告??涩蜘。當然為了方便和特殊情況,也可在相應代碼處手動關閉警告熏纯,或是在整個項目中關閉警告同诫,十分靈活。
代碼規(guī)范請參考:Swift Style Guide