2019年触ってみたいiOSライブラリ

# はじめに

[GameWith Advent Calendar 2018](https://qiita.com/advent-calendar/2018/gamewith) 8日目担当のkyamです。

最近iOS開発をしていて思ったのが、長くiOS開発をしていると使うライブラリが大体固定化されてきて新しいものを使うことが昔に比べて減ったなと最近感じました。
通信なら○○、画像キャッシュなら○○、AutoLayoutなら○○、と言った様に個人的なお気に入りはあるのでチーム開発を除いて、個人開発をする場合には使うライブラリが限られてきます。

GitHubの[Trending Repositories](https://github.com/trending/swift?since=daily)を眺めるのが好きなんですが実際のプロダクトで使えるものを探すというよりは、今何が流行っていてそのライブラリがどんな書き方をしているのか、といった興味関心から見ることが多いです。

自分は今回はTrending Repositoriesの中から今注目されているライブラリを何個か紹介するのに加えて、年末も近いということで1年を振り返って実際にプロダクトで使って良かったものを合わせて簡単に紹介します。

この記事を読んでくれた皆さんには、この一年振り返ってこのライブラリをプロダクトに導入したけど良かったなど実用的なものをコメント欄で紹介してくれたら嬉しいです :cat: 

# Trending Repositories

## 面白そうなライブラリ

### [Marionette](https://github.com/LinusU/Marionette)

12/5が最初のコミットなのでまだ出たばかりの新しいライブラリですね。
`WKWebView` を操作することが目的のライブラリで、ゴールは[puppeteer](https://github.com/GoogleChrome/puppeteer)のようなものにすることだそうです。社内で`WKWebView`を用いているアプリもあるので今後触る機会もあるかもしれません。

```swift
let page = Marionette()

firstly {
    page.goto(URL(string: "https://www.google.com/")!)
}.then {
    page.type("input[name='q']", "LinusU Marionette")
}.then {
    when(fulfilled: page.waitForNavigation(), page.click("input[type='submit']"))
}.then {
    page.screenshot()
}.done {
    print("Screenshot of Google results: \($0)")
}
```

### [flashy-tabbar](https://github.com/Cuberto/flashy-tabbar)

![animation.gif](https://qiita-image-store.s3.amazonaws.com/0/66235/126cc297-6169-4973-ca7d-92994374d0ba.gif)

11/29が最初のコミットなのでこちらも比較的新しいライブラリです。
`UITabBarController`のアニメーションライブラリは比較的貴重なのでソースコードを読みたいなと思いピックアップしました。　
`storyboard` or `nib` を用いて実装を行う様です。
個人的にはアニメーションでタブの画像が上にずれる際見切れる感じのアニメーションになっているのが少し気になります。
アニメーション系のライブラリはアニメーションを見て自分だったらこういう感じに実装するなというイメージを持ってからソースコードを見ると結構学びがあって面白いです。

## 使いたいライブラリ

### [SkeletonView](https://github.com/Juanpe/SkeletonView)
![sliding_left_to_right.gif](https://qiita-image-store.s3.amazonaws.com/0/66235/c4466397-fc42-a818-7c67-9abea7a9d9e4.gif)

新規プロダクトに入る際に毎回採用しようか悩むライブラリです。

FacebookやYouTubeアプリなどで用いられているSkeletonView。
通信状態が悪い場合にUIを表示させるまでに用います。
普通に画面の中心にローディングを回すよりも、コンテンツの形が予め分かる（何を読み込んでいるのかが分かりやすい)ため`UIActivityIndicator`などをシンプルに使うよりもユーザー体験が少し良くなります。

アプリに合ったSkeletonViewを自作した方が便利かなと思いライブラリの導入は見送るのですが、この一年くらいずっと人気があるのでカスタマイズが容易であれば導入を検討したいです。

### [PINRemoteImage](https://github.com/pinterest/PINRemoteImage)

Pinterest社製の画像キャッシュライブラリです。
[SDWebImage](https://github.com/SDWebImage/SDWebImage)や[KingFisher](https://github.com/onevcat/Kingfisher)を使う人が多く、最近だとダウンロード速度が早いことで有名な[Nuke](https://github.com/kean/Nuke)も採用されることが多い印象です。
一方で`PINRemoteImage`は比較されることはあれどあまりメインで使ってるプロジェクトを自分は知りません。速度というよりはメモリ消費量が非常に少ないことで推されています。

`PINRemoteImage`のソースコードはまだ一度も読んだことがないので、読んでみて何故他のライブラリよりメモリ消費量が優れているのかを調べてみようと思います。ダウンロード速度の差は正直ライブラリ間で体感でわかるレベルではないのでメモリ消費量が優れているのであれば導入の価値はあるかもしれません。

### [Charts](https://github.com/danielgindi/Charts)

簡単にあらゆるチャートが作れるライブラリです。
チャート周りは自前で作ると結構大変なのでこの辺使って見たいですね。

今年の[クソアプリアドベントカレンダー](https://qiita.com/advent-calendar/2018/kuso-app)の[Vue.js + Onsen UIで作る晩ご飯ランダムスロット](https://qiita.com/Duuun/items/1f8b5f83af0734b52a82)が個人的に好きで、自分用にアプリ版作ろうかなと思ったんですがその時に上記ライブラリのPie Chartが使えそうだなと思いました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/66235/a16d22e9-068d-3a31-fb7f-8005784cd924.png" width="400" height="400">

### [SwifterSwift](https://github.com/SwifterSwift/SwifterSwift)

昔からありますが、Swiftの便利なExtensionを集めたライブラリです。
Extensionは結構自分で作るので、改めて見ると勉強になるかもなと思いました。
社内のiOSエンジニアでお気に入りのExtension紹介し合う勉強会とかも面白そうです！

# 2018年使って良かったライブラリ(おまけ)

### [TransitionalTab](https://github.com/Interactive-Studio/TransitionableTab)

タブ切り替え時に画面にアニメーションをかけるためのライブラリです。
[spotify](https://itunes.apple.com/jp/app/spotify-music/id324684580?l=en&mt=8)などが個人的にタブ切り替え時のアニメーションをかけているイメージが強いです。

`TransitionalTab`では、`Move`, `Scale`, `Fade`, `Custom` とアニメーションの種類を選べるのですがアニメーションの質も良くコードもシンプルでかなり使いやすかったです。

### [Firebase SDK](https://firebase.google.com/docs/ios/setup?hl=ja)

2018年Firebase SDKの各サービスを大体使ったのですがいずれも使いやすくてオススメです。
詳しくはこちらにまとめています。
[Firebaseをプロダクトに採用して得た知見](https://tech.gamewith.co.jp/entry/2018/11/09/122551)

# まとめ

ライブラリの導入に関しては導入フェーズに応じて一長一短であり、また個人開発かチーム開発かによって意味合いも変わってくるかと思います。
チーム開発を考えると最近は会社の中で社内OSSのような形でライブラリを作りそれを運用するという例が増えてきており、そのような形はメンバーのライブラリへの共通理解があるという点で望ましいなと思います（もちろん内容にはよると思います)

ただそうではなく外部のライブラリを導入する場合は、

・ただ単純に便利だから :hugging: 
・工数削減できるから(影響範囲理解していない) :muscle: 
・皆使ってるから :ear: 

といって安直に採用するのではなくて、特にチーム開発の場合はメンバーへの信頼性にも繋がると思うので、なぜ採用したのか、なぜ同じような内容の別の○○ではないのか、まで説明できると良いなと思います。
# 最後に

GameWithには `OSS コントリビュータ / コミッタ手当` といった素敵な制度もあるので自分でライブラリを作るだけでなく上記の様に気になったライブラリにはどんどんコミットしていこうと思います！

明日の9日目は iOSエンジニアの @chuymaster がLINE Botを活用した面白い事例について執筆します。
そちらもお楽しみに！