iOSアプリ開発で(自分が)使えるなあ、使いたいなあと思ったライブラリーをリストアップします。Swiftのみとして、Objective-Cは載せていません。
Reactive Extensions
RxSwift
Combine Frameworkの登場で自分にとってのRxSwiftは終焉を迎えそうです
AppleがWWDC19で発表したCombine Frameworkは、私がアーキテクチャー上最も重要だと考えるRxSwiftの主機能(Publish/Subscribeによる)Observer(パターン)を完全に置き換えます。
RxはReactive Extensionsの略です。もともとはC#が発祥ですが、javaを始めとしてswiftにも実装されています。swiftには独自の拡張として、RxCocoaがあり、iOSのUIKitをReactive Extensionsのパーツとして使うことができます。
自分勝手な視点ですが利点をあげると、
- View(UIView/UIViewController)の制御を非同期に記述することが容易。
- それによってViewを別のレイヤー(ViewModel/Modelなど)から容易に分離することができる。
RxSwiftがなぜ有用と考えるのかの自分なりの考察をこちらにアップしました。
iOSアプリの基本設計を考える:疎結合の概念から構造化、MVVM、RxSwiftまで
非同期処理
非同期処理ライブラリーです。
実はRxSwiftでも同様の記述は実現できるのですが、あえてここで上げてみました。
利点は単純です。
- 非同期の処理を綺麗に書けること。
例えば非同期の処理をネストしないでシリアルに記述できたり、平行動作している非同期の処理をJoinできたりもします。機能ではなく記述であると言ってしまっても良いかもしれません。
これは標準でSwiftに言語として取り込んで欲しい気がします。BrightFuturesの開発者はSwiftに取り込んで欲しいという講演もしています。Youtube参照
PromiseKit
BrightFutures
Bolts-Swift
SwiftTask
ネットワーク通信
Alamofire
定番です。ただ高機能すぎるかもしれません。
APIKit
APIKitは日本の方が開発されたシンプルで綺麗なコードが書けるネットワークライブラリーです。
ネットワークの接続監視
Reachability.swift
Objective-CではApple製のReachabilityが標準ですが、言語をSwiftで統一したい場合はこちらを。
参考例をこちらの記事で書いています。
[iOSアプリの基本設計を考える:疎結合の概念から構造化、MVVM、RxSwiftまで]
(https://qiita.com/BlueEventHorizon/items/a712e6fa9fcdc1bdd4b5)
デコーダ
ObjectMapper
定番です。
もはや下記Codable一択な感じがしますね。
Himotoki
Himotokiは、軽量、タイプセーフなJSONデコーダです。日本の方が開発されており、同じく日本初のAPIKitと組み合わせて利用すされるケースも散見されます。自分も結構この組み合わせは好きです。
Codable
CodableはSwift標準機能であり、シンプルに記述できてとても良いです。このCodableの構造体を出力するmac用のアプリケーションがありますのでこちらをご覧ください。
(※デコーダ=>正確に言うとHTTPレスポンスのデコーダですね)
リソースの定義
Rswift
ソースコードの文字列を始めとするリソースの定義をstructを使って自動的にリストアップしてくれます。
例えば
let icon = UIImage(named: "settings-icon")
let font = UIFont(name: "San Francisco", size: 42)
let color = UIColor(named: "indictator highlight")
let viewController = CustomViewController(nibName: "CustomView", bundle: nil)
let string = String(format: NSLocalizedString("welcome.withName", comment: ""), locale: NSLocale.current, "Arthur Dent")
上のコードは
let icon = R.image.settingsIcon()
let font = R.font.sanFrancisco(size: 42)
let color = R.color.indicatorHighlight()
let viewController = CustomViewController(nib: R.nib.customView)
let string = R.string.localizable.welcomeWithName("Arthur Dent")
と書くことができるようになります。(https://github.com/mac-cain13/R.swift より引用)
アニメーション
fluid-interfaces
WWDC 2018のセッション"Designing Fluid Interfaces"の述べられたジェスチャーベースのデザイン理論に基づいて?作成されたらしいです。
![fluid-interfaces]
(https://raw.githubusercontent.com/nathangitter/fluid-interfaces/master/Resources/flashdemo.gif)
lottie-ios
アニメーションといえば、lottieがイチオシです。
Airbnbが開発したiOS、Android、Web対応のアニメーション・ライブラリです。
Adobe After Effectsから、json形式に変換してexportすることで、ios(など)にAfter Effectsと同等のアニメーションを実装することができます。
ただし、全てのアニメーションEffectsがexportできるかと言うとそうではないので、使えない機能を把握することが必須です。(ほぼほぼ使えるようですが)
![lottie-ios]
(https://github.com/airbnb/lottie-ios/raw/master/_Gifs/Examples1.gif "lottie-ios")
https://github.com/airbnb/lottie-ios より引用
Hero
トランジション・アニメーション集
![Hero]
(https://camo.githubusercontent.com/ad3b44a1f8c9ad51ba120b6281b03335bd78bb22/68747470733a2f2f63646e2e7261776769742e636f6d2f6c6b7a68616f2f4865726f2f656262336632632f5265736f75726365732f66656174757265732e737667 "Hero")
![Hero2]
(https://camo.githubusercontent.com/737194a3442f67b2066bd1be40d0ced772c158a1/68747470733a2f2f63646e2e7261776769742e636f6d2f6c6b7a68616f2f4865726f2f656262336632632f5265736f75726365732f64656661756c74416e696d6174696f6e732e737667 "Hero2")
LTMorphingLabel
UILabelのアニメーション
![LTMorphingLabel]
(https://cloud.githubusercontent.com/assets/219689/3491822/96bf5de6-059d-11e4-9826-a6f82025d1af.gif "LTMorphingLabel")
Side Menu
ちょっと真似たいメニュー
Gemini
写真を扱うときは使ってみたい
![Gemini]
(https://github.com/shoheiyokoyama/Assets/raw/master/Gemini/circle-vertical.gif "Gemini")
NVActivityIndicatorView
NVActivityIndicatorViewは最近人気があるようです。
シンプルかつバリエーションがあっていい感じです。
![NVActivityIndicatorView]
(https://raw.githubusercontent.com/ninjaprox/NVActivityIndicatorView/master/Demo.gif "NVActivityIndicatorView")
インジケータ
PKHUD
ネットワークのレスポンス待ちなどで表示するプログレス・インジケータ。軽量。
GradientCircularProgress
これも綺麗で好きです。
データベース
Realm Swift
データベースのコードを簡単に、簡潔に記述できる優れものです!
アプリ自身がデータベースを持っており、サーバ側のデータベースと同期できるために、オフライン状態でもアプリが動作することがっで来ます。
リレーションも使えます。
class Dog: Object {
dynamic var name = ""
dynamic var age = 0
}
// デフォルトRealmを取得します
let realm = try! Realm()
let myDog = Dog()
myDog.name = "Rex"
myDog.age = 1
// データを永続化するのはとても簡単です
try! realm.write {
realm.add(myDog)
}
コードは一部こちらより拝借いたしました。
課金
SwiftyStoreKit
課金プログラミングは結構複雑な上に失敗できない(他も失敗はダメですけど)のでコレ
グラフ
Graphs
リクルート発のシンプル軽量なグラフ作成ライブラリー
Date
SwiftDate
Dateはミスしやすいので重宝します。
画像取得
Kingfisher
URLを指定してネットワーク上の画像を取得できます。
Nuke
機能的にはKingfisherとさほど変わらないようですが、
下記記事で計測した結果、Nukeが画像表示で一番早いそうです。
【[Swiftの有名画像キャッシュライブラリを比較してみた]
(https://qiita.com/H_Crane/items/422811dfc18ae919f8a4)】
UserDefaults
DefaultsKit
~Codableプロトコルを利用し構造体もUserDefaultsを使ってそのまま読み書きできます。
若干記述が長い気もしますが、UserDefaultsを直接使うよりははるかにマシです。~