iOSライブラリ選定チートシート

iOSアプリ開発のライブラリ選定時に、定番ライブラリが沢山乗っている記事があったら嬉しいな〜と思い、調べて書いてみました。

「他にもこんな良いライブラリがあるよ！」等ありましたら、教えていただけると嬉しいです！

- GitHubでstarが多かったり、よく名前を耳にするライブラリを集めました
- ライブラリ名の横にライセンス種別を記載しています。
    - 最新のライセンスではない可能性があるので導入の際は実際にリポジトリのライセンスページをご確認ください。

[2020/03/01 いくつかライブラリを追加しました]
[2023/05/16 古い情報を修正しました]

# Network
迷ったらAlamofireを使えば良いと思います
## Alamofire[MIT]
https://github.com/Alamofire/Alamofire

- パパっとネットワーク通信ができるライブラリ
- Alamofireのメソッド1つでAPIが叩けるので、クセがなくとても使いやすい

## APIKit[[ライセンス文](https://github.com/ishkawa/APIKit/blob/master/LICENSE.md)]
https://github.com/ishkawa/APIKit

- タイプセーフ(APIのレスポンスをModelにパースしやすい構成)なネットワーキングライブラリ
- Modelへのパース処理もAPIKitに含まれているので、Alamofireに比べたら専用のサブクラスを定義をしなければいけないというクセがある

## Moya[MIT]
https://github.com/Moya/Moya

- Alamofireのラッパーライブラリ, Alamofireの処理をさらに簡略化
- リクエスト型を定義して、Moyaのメソッドに入れればAPIの処理を全部やってくれる

# JSONDecoder
Codableを使ってみて、使いにくいと思ったらSwiftyJSONやHimotokiに手を出すと良いです
## Codable(Decodable)
Fondationに入っている

- レスポンスのJSONのkeyと同じ名前の変数を定義しておけば自動でパパッとデコードしてくれる

## SwiftyJSON[MIT]
https://github.com/SwiftyJSON/SwiftyJSON

- 使用するためのクラス定義などが必要なく、クセが少ないので初心者におすすめ

## ObjectMapper[MIT]
https://github.com/tristanhimmelman/ObjectMapper

- デコードの独自演算子(`<-`)などがあって面白い

## Himotoki[MIT]
https://github.com/ikesyo/Himotoki

- ObjectMapperにインスパイアを受けているらしい
- デコードの独自演算子(`<|`)などがこちらにもある

# 非同期処理
## Swift Concurrency

Swift5.5でSwiftにasync awaitが導入されました。基本的にはこちらを採用すると良いと思います。
参考記事: [Swift Concurrency チートシート](https://zenn.dev/koher/articles/swift-concurrency-cheatsheet)

## Promise
Javascript発祥の非同期処理オブジェクト。複数のライブラリが存在するが、大体の書き方はどれも同じ。
PromiseKit以外更新が止まりかけてる...

### PromiseKit[MIT]
https://github.com/mxcl/PromiseKit

- 一番有名
- `.then`と`.done`を使い分ける必要あり

### Hydra[MIT]
https://github.com/malcommac/Hydra

- async/await的な書き方もできる

### Promises[Apache2.0]
https://github.com/google/promises

- Google作
- シンプルなPromiseって感じで好き

## SwiftTask[MIT]
https://github.com/ReactKit/SwiftTask

- Promiseをさらに拡張した感じ
- ガチで非同期処理やりたい人向け

## Bolts[BSD]
https://github.com/BoltsFramework/Bolts-Swift

- 個人的にはPromiseで良いと思った
- 「Boltsのここが良い！！」という情報求む！

## RxSwift[MIT]
https://github.com/ReactiveX/RxSwift

- 他のライブラリと比べ規模が大きいので注意
- 詳しくはこちらの記事参照: [ゼロからはじめるRxSwift（Swift4）](https://qiita.com/orimomo/items/3120aff12a06f0ab14e2)

# 画像取得
URLから画像をダウンロードして表示するやつ

たくさんあるのでこちらの記事を参照: [Swiftの有名画像キャッシュライブラリを比較してみた](https://qiita.com/H_Crane/items/422811dfc18ae919f8a4)

## Kingfisher[MIT]
https://github.com/onevcat/Kingfisher

- アニメーション, placeholder, prefetchなど多機能で無難

## Nuke[MIT]
https://github.com/kean/Nuke

- 高速で良い
- 速さを求めたり、大量に画像を表示するならこれ

# データベース
Modelをアプリ内に保存しておきたい場合にデータベースライブラリを用いる事が多い。記事アプリのオフライン閲覧とかこれ。

## CoreData
- Apple産
- オープンソースではなく、ブラックボックスであることへの懸念がある
- iOS13からのSwiftUIとの結合などで継続的にアップデートしているイメージがある

## Realm[Apache2.0]
https://github.com/realm/realm-cocoa

- [公式ドキュメント](https://realm.io/docs/swift/latest)がしっかりしてて良い
- SQLiteより軽量で高速

# Linter
## SwiftLint[MIT]
https://github.com/realm/SwiftLint

- プログラムの記述方法をチェックしてくれる物
- 変な書き方(スペースを入れていないなど)をXcode上のwarningとして表示してくれる。

# Logger
ログ出力ライブラリを導入することでデバッグがしやすくなるのでおすすめ

## XCGLogger[MIT]
https://github.com/DaveWoodCom/XCGLogger

- シンプル
- [info], [error], [warning]等のラベルとログが出力されたクラスと行番号を表示できる。

## SwiftyBeaver[MIT]
https://github.com/SwiftyBeaver/SwiftyBeaver

- ログを閲覧する専用のデスクトップアプリがあり、ログの種類でフィルターをかけたり, マーキングできたりするリッチなLogger
- もちろんLogger単体としても使用できる

## swift-log[Apache2.0]
https://github.com/apple/swift-log

- Apple製ロギングライブラリ


# AutoLayout
コード記述でAutoLayoutをするやつ

## NSLayoutConstraint
- UIKitに入っている
- 普通に使いやすい

https://developer.apple.com/documentation/uikit/nslayoutconstraint

## SnapKit[MIT]
https://github.com/SnapKit/SnapKit

- 昔から有名なAutoLayoutのライブラリ
- が、ほぼ同じことができるので最近は`NSLayoutConstraint`で十分と言われている

## TinyConstraints[MIT]
https://github.com/roberthein/TinyConstraints

- `NSLayoutConstraint`のラッパーライブラリ
- `SnapKit`を使うくらいならこちらの方がいい気がする

# Misc
## Reachability.swift[MIT]
https://github.com/ashleymills/Reachability.swift

- ネットワーク状態を取得できる
- APIを叩く前にネットワーク情報を調べる事で無駄な通信を減らせる上、エラーハンドリングもやりやすくなる


## PluggableAppDelegate[MIT]
https://github.com/pchelnikov/PluggableAppDelegate

- 色々とセットアップを行うとすぐに肥大化してしまうAppDelegateを複数のクラスに分けて綺麗に書くことができる

## Instantiate[MIT]
https://github.com/tarunon/Instantiate

- ViewControllerやViewへのDIをサポートするライブラリ
- `Storyboard`や`Xib`からのインスタンス化もサポートされている

## ReusableKit[MIT]
https://github.com/devxoul/ReusableKit

Table/CollectionViewのCellのregister, dequeueを以下のように簡単に行えるようにする物。

```swift

let reusableUserCell = ReusableCell<UserCell>()
collectionView.register(reusableUserCell)
collectionView.dequeue(reusableUserCell)
```

Cellをサブクラスのままdequeueできるので、Cellのダウンキャストの必要がなくて便利。

## R.swift[MIT]
https://github.com/mac-cain13/R.swift

```swift

let icon = UIImage(named: "settings-icon")
let font = UIFont(name: "San Francisco", size: 42)
let color = UIColor(named: "indictator highlight")
```

を

```swift

let icon = R.image.settingsIcon()
let font = R.font.sanFrancisco(size: 42)
let color = R.color.indicatorHighlight()
```

といった感じで記述できるように、画像などのリソースの型を定義するコードを自動生成するライブラリ

## SwiftGen[MIT]
https://github.com/SwiftGen/SwiftGen

- 立ち位置は`R.swift`とほぼ同じ
- どちらが良いか？は参考記事: [R.swiftとSwiftGenの導入方法とどちらを採用した方がいいのか](https://qiita.com/ostk0069/items/aa07ac55be075a50326c#rswift%E3%81%A8swiftgen%E3%81%AE%E6%AF%94%E8%BC%83)

## SwiftDate[MIT]
https://github.com/malcommac/SwiftDate

- 日付周りの処理を簡単にやってくれるもの

## KeychainAccess[MIT]
https://github.com/kishikawakatsumi/KeychainAccess

- ID, パスワード保存

## LicensePlist[MIT]
https://github.com/mono0926/LicensePlist

- 導入するだけでライセンス一覧を設定アプリ内に表示できるすごい物

# アニメーション系
## PKHUD[MIT]
https://github.com/pkluz/PKHUD

- AppleっぽいデザインのHUD

![](https://cloud.githubusercontent.com/assets/1275218/10124182/09f4c406-654f-11e5-9cab-0f2e6f470887.gif)
(Githubから引用)

## lottie-ios[Apache2.0]
https://github.com/airbnb/lottie-ios

- いい感じのアニメーション集

![](https://raw.githubusercontent.com/airbnb/lottie-ios/master/_Gifs/Examples1.gif)
(Githubから引用)

## Hero[MIT]
https://github.com/HeroTransitions/Hero

- いい感じのViewControllerアニメーション
- AppleStoreのTodayみたいな画面遷移ができる

![](https://camo.githubusercontent.com/ad3b44a1f8c9ad51ba120b6281b03335bd78bb22/68747470733a2f2f63646e2e7261776769742e636f6d2f6c6b7a68616f2f4865726f2f656262336632632f5265736f75726365732f66656174757265732e737667)

(Githubから引用)

## SkeletonView[MIT]
https://github.com/Juanpe/SkeletonView

- TableViewとかのロード中に出すやつ

![](https://github.com/Juanpe/SkeletonView/blob/master/Assets/gradient_animated.gif?raw=true)

(Githubから引用)

# レイアウト系

## IGListKit[MIT]
https://github.com/Instagram/IGListKit

- Insta作CollectionViewライブラリ
- 複雑なCollectionのレイアウトでもスッキリ書く事ができる

## AMScrollingNavbar[MIT]
https://github.com/andreamazz/AMScrollingNavbar

- スクロールするとNavigationBarが折りたたまれるやつ

![](https://github.com/andreamazz/AMScrollingNavbar/blob/master/assets/screenshot.gif?raw=true)

(Githubから引用)

## PanModal[MIT]
https://github.com/slackhq/PanModal

- Slack作下から出てくるメニュー
- Twitterアプリのアカウント切り替えメニューみたいなやつ


<img src="https://cocoacontrols-production.s3.amazonaws.com/uploads/control_image/image/14704/Simulator_Screen_Shot_-_iPhone_SE_-_2019-03-14_at_09.08.24.png" width=50%>
(https://www.cocoacontrols.com/controls/panmodal  から引用)

## SPStorkController[MIT]
https://github.com/IvanVorobei/SPStorkController

- AppleMusicのような下から出てくる画面

![](https://github.com/IvanVorobei/SPStorkController/blob/master/Resources/Preview.gif?raw=true)

(Githubから引用)

## TOCropViewController[MIT]
https://github.com/TimOliver/TOCropViewController

- SNSでよくある、プロフィール用に画像を丸く切り抜く画面

![](https://raw.githubusercontent.com/TimOliver/TOCropViewController/master/Images/screenshot.jpg)

(Githubから引用)

## XLPagerTabStrip[MIT]
https://github.com/xmartlabs/XLPagerTabStrip

- AndroidにあるSegmentのライブラリ

![](https://github.com/xmartlabs/XLPagerTabStrip/blob/master/Example/instagram.gif?raw=true)

(Githubから引用)

## FSPagerView[MIT]
https://github.com/WenchaoD/FSPagerView

- スライドショーなどに使える横スクロール

![](https://cloud.githubusercontent.com/assets/5186464/22688057/9003d880-ed65-11e6-882e-4587c97c8878.gif)

(Githubから引用)

## SwiftMessages[MIT]
https://github.com/SwiftKickMobile/SwiftMessages

- 色々なアラート/トーストを表示できる

![](https://github.com/SwiftKickMobile/SwiftMessages/blob/master/Demo/demo.png?raw=true)

(Githubから引用)

## SwiftEntry[MIT]
https://github.com/huri000/SwiftEntryKit

- アラート, トースト, バナーなどを表示できる
- カスタマイズ性が高い

| Toasts | Notes | Floats | Popups |
| --- | --- | --- | --- |
| ![toasts_example](https://github.com/huri000/assets/blob/master/swift-entrykit/toasts.gif?raw=true) | ![notes_example](https://github.com/huri000/assets/blob/master/swift-entrykit/notes.gif?raw=true) | ![floats_example](https://github.com/huri000/assets/blob/master/swift-entrykit/floats.gif?raw=true) | ![popup_example](https://github.com/huri000/assets/blob/master/swift-entrykit/popups.gif?raw=true) |

| Alerts | Forms | Rating | More... |
| --- | --- | --- | --- |
| ![alert_example](https://github.com/huri000/assets/blob/master/swift-entrykit/alerts.gif?raw=true) | ![form_example](https://github.com/huri000/assets/blob/master/swift-entrykit/forms.gif?raw=true) | ![rating_example](https://github.com/huri000/assets/blob/master/swift-entrykit/rating.gif?raw=true) | ![custom_example](https://github.com/huri000/assets/blob/master/swift-entrykit/custom.gif?raw=true) |

(Githubから引用)

## ActiveLabel.swift[MIT]
https://github.com/optonaut/ActiveLabel.swift

- Label拡張 URLとかハッシュタグとかを埋め込める

![](https://github.com/optonaut/ActiveLabel.swift/blob/master/ActiveLabelDemo/demo.gif?raw=true)
(Githubから引用)

## TagListView[MIT]
https://github.com/ElaWorkshop/TagListView

- 検索画面のタグ検索とかによくあるやつ

![](https://github.com/ElaWorkshop/TagListView/blob/master/Screenshots/Screenshot.png?raw=true)

(Githubから引用)

## Floaty[MIT]
https://github.com/kciter/Floaty

- 多機能フローティングボタン

![](https://raw.githubusercontent.com/kciter/Floaty/master/Images/preview.gif)

(Githubから引用)