【Swift】iOSアプリ開発で使える（使いたい）Swiftライブラリー

iOSアプリ開発で（自分が）使えるなあ、使いたいなあと思ったライブラリーをリストアップします。Swiftのみとして、Objective-Cは載せていません。

## Reactive Extensions
### [RxSwift](https://github.com/ReactiveX/RxSwift)

<font color="DeepPink">Combine Frameworkの登場で自分にとってのRxSwiftは終焉を迎えそうです
AppleがWWDC19で発表したCombine Frameworkは、私がアーキテクチャー上最も重要だと考えるRxSwiftの主機能（Publish/Subscribeによる）Observer（パターン）を完全に置き換えます。
</font>

RxはReactive Extensionsの略です。もともとはC#が発祥ですが、javaを始めとしてswiftにも実装されています。swiftには独自の拡張として、RxCocoaがあり、iOSのUIKitをReactive Extensionsのパーツとして使うことができます。

自分勝手な視点ですが利点をあげると、

1. View(UIView/UIViewController)の制御を非同期に記述することが容易。
2. それによってViewを別のレイヤー（ViewModel/Modelなど）から容易に分離することができる。

RxSwiftがなぜ有用と考えるのかの自分なりの考察をこちらにアップしました。
[iOSアプリの基本設計を考える：疎結合の概念から構造化、MVVM、RxSwiftまで](https://qiita.com/BlueEventHorizon/items/a712e6fa9fcdc1bdd4b5)


## 非同期処理

非同期処理ライブラリーです。
実はRxSwiftでも同様の記述は実現できるのですが、あえてここで上げてみました。
利点は単純です。

1. 非同期の処理を綺麗に書けること。

例えば非同期の処理をネストしないでシリアルに記述できたり、平行動作している非同期の処理をJoinできたりもします。機能ではなく記述であると言ってしまっても良いかもしれません。
これは標準でSwiftに言語として取り込んで欲しい気がします。BrightFuturesの開発者はSwiftに取り込んで欲しいという講演もしています。[Youtube参照](https://www.youtube.com/watch?v=vjGvsJv4Wos)

### [PromiseKit](https://github.com/mxcl/PromiseKit) 
### [BrightFutures](https://github.com/Thomvis/BrightFutures) 
### [Bolts-Swift](https://github.com/BoltsFramework/Bolts-Swift)
### [SwiftTask](https://github.com/ReactKit/SwiftTask)


## ネットワーク通信
### [Alamofire](https://github.com/Alamofire/Alamofire)
定番です。ただ高機能すぎるかもしれません。
###  [APIKit](https://github.com/ishkawa/APIKit) 
APIKitは日本の方が開発されたシンプルで綺麗なコードが書けるネットワークライブラリーです。

## ネットワークの接続監視

### [Reachability.swift](https://github.com/ashleymills/Reachability.swift)
Objective-CではApple製のReachabilityが標準ですが、言語をSwiftで統一したい場合はこちらを。

参考例をこちらの記事で書いています。
[iOSアプリの基本設計を考える：疎結合の概念から構造化、MVVM、RxSwiftまで]
(https://qiita.com/BlueEventHorizon/items/a712e6fa9fcdc1bdd4b5)

## デコーダ
### [ObjectMapper](https://github.com/Hearst-DD/ObjectMapper) 
~~定番です。~~
もはや下記**Codable**一択な感じがしますね。

### [Himotoki](https://github.com/ikesyo/Himotoki) 
Himotokiは、軽量、タイプセーフなJSONデコーダです。日本の方が開発されており、同じく日本初のAPIKitと組み合わせて利用すされるケースも散見されます。自分も結構この組み合わせは好きです。
### Codable
CodableはSwift標準機能であり、シンプルに記述できてとても良いです。このCodableの構造体を出力するmac用のアプリケーションがありますので[こちら](https://qiita.com/BlueEventHorizon/items/6017c50a225dd5baaf90)をご覧ください。
（※デコーダ＝＞正確に言うとHTTPレスポンスのデコーダですね）


## リソースの定義
### [Rswift](https://github.com/mac-cain13/R.swift)
ソースコードの文字列を始めとするリソースの定義をstructを使って自動的にリストアップしてくれます。

例えば

```swift:Swift
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")
```
上のコードは

```swift:Swift
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](https://github.com/nathangitter/fluid-interfaces)
WWDC 2018のセッション"Designing Fluid Interfaces"の述べられたジェスチャーベースのデザイン理論に基づいて？作成されたらしいです。
![fluid-interfaces]
(https://raw.githubusercontent.com/nathangitter/fluid-interfaces/master/Resources/flashdemo.gif)

### [lottie-ios](https://github.com/airbnb/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](https://github.com/lkzhao/Hero?ref=ioscookies.com)
トランジション・アニメーション集
![Hero]
(https://camo.githubusercontent.com/ad3b44a1f8c9ad51ba120b6281b03335bd78bb22/68747470733a2f2f63646e2e7261776769742e636f6d2f6c6b7a68616f2f4865726f2f656262336632632f5265736f75726365732f66656174757265732e737667 "Hero")
![Hero2]
(https://camo.githubusercontent.com/737194a3442f67b2066bd1be40d0ced772c158a1/68747470733a2f2f63646e2e7261776769742e636f6d2f6c6b7a68616f2f4865726f2f656262336632632f5265736f75726365732f64656661756c74416e696d6174696f6e732e737667 "Hero2")

### [LTMorphingLabel](https://github.com/lexrus/LTMorphingLabel)
UILabelのアニメーション
![LTMorphingLabel]
(https://cloud.githubusercontent.com/assets/219689/3491822/96bf5de6-059d-11e4-9826-a6f82025d1af.gif "LTMorphingLabel")

### [Side Menu](https://github.com/Yalantis/Side-Menu.iOS)
ちょっと真似たいメニュー

### [Gemini](https://github.com/shoheiyokoyama/Gemini)
写真を扱うときは使ってみたい
![Gemini]
(https://github.com/shoheiyokoyama/Assets/raw/master/Gemini/circle-vertical.gif  "Gemini")

### [NVActivityIndicatorView](https://github.com/ninjaprox/NVActivityIndicatorView)

NVActivityIndicatorViewは最近人気があるようです。
シンプルかつバリエーションがあっていい感じです。


![NVActivityIndicatorView]
(https://raw.githubusercontent.com/ninjaprox/NVActivityIndicatorView/master/Demo.gif "NVActivityIndicatorView")

## インジケータ
### [PKHUD](https://github.com/pkluz/PKHUD)
ネットワークのレスポンス待ちなどで表示するプログレス・インジケータ。軽量。

![PKHUD](https://cloud.githubusercontent.com/assets/1275218/10124182/09f4c406-654f-11e5-9cab-0f2e6f470887.gif "PKHUD")

### [GradientCircularProgress](https://github.com/keygx/GradientCircularProgress)
これも綺麗で好きです。

![スクリーンショット 2017-12-09 20.53.14.png](https://qiita-image-store.s3.amazonaws.com/0/37634/aed799a7-2b8d-01c6-e245-81f0ebc9dfce.png)


## データベース
### [Realm Swift](https://realm.io)

データベースのコードを簡単に、簡潔に記述できる優れものです！
アプリ自身がデータベースを持っており、サーバ側のデータベースと同期できるために、オフライン状態でもアプリが動作することがっで来ます。
リレーションも使えます。

```swift: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)
}

```

コードは一部[こちら](https://realm.io/jp/docs/swift/latest/)より拝借いたしました。

## 課金
[SwiftyStoreKit](https://github.com/bizz84/SwiftyStoreKit)
課金プログラミングは結構複雑な上に失敗できない（他も失敗はダメですけど）のでコレ

## グラフ
### [Graphs](https://github.com/recruit-mtl/Graphs)
リクルート発のシンプル軽量なグラフ作成ライブラリー

## Date
### [SwiftDate](https://github.com/malcommac/SwiftDate)
Dateはミスしやすいので重宝します。

## 画像取得
### [Kingfisher](https://github.com/onevcat/Kingfisher)
URLを指定してネットワーク上の画像を取得できます。

### [Nuke](https://github.com/kean/Nuke)
機能的にはKingfisherとさほど変わらないようですが、
下記記事で計測した結果、Nukeが画像表示で一番早いそうです。

　【[Swiftの有名画像キャッシュライブラリを比較してみた]
(https://qiita.com/H_Crane/items/422811dfc18ae919f8a4)】

## UserDefaults
### [DefaultsKit](https://github.com/nmdias/DefaultsKit)
~Codableプロトコルを利用し構造体もUserDefaultsを使ってそのまま読み書きできます。
若干記述が長い気もしますが、UserDefaultsを直接使うよりははるかにマシです。~