iOS開発が捗るライブラリの探し方


[iOS Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ios) 14日目の [@tdkn_](https://twitter.com/tdkn_) です！
[株式会社バックムーン](https://www.buckmoon.co.jp/) でエンジニアしてます。会社では「てど氏」って呼ばれています:relaxed:

13日目は [@kamekiti](https://qiita.com/kamekiti) さんの「iOSアプリ新規開発のノウハウ」でした。
ちなみに明日の担当は [@huin](https://qiita.com/huin) さんです。

Advent Calendar に参加するのは今回が初めてです。当初は面白い記事書いてやるぞ〜と意気込んで参加登録したものの、なかなか執筆時間が確保できず...。そこで、今回は僕が iOS 開発をする中でライブラリ探しをするときのフローと、実際によく使っているおすすめのライブラリを紹介したいと思います。

# ライブラリの探し方

1. Awesome iOS を眺める
    知らない人もいるかもしれないので説明すると、まず GitHub に [awesome](https://github.com/sindresorhus/awesome) というリポジトリがあります。_**Awesome**_ とは _**素晴らしい**_ という意味で、ここには素晴らしいライブラリや素晴らしい資料などがリスト化されています。（JS界隈では有名な Sindre Sorhus さんがオーナー）
    そのなかでも [awesome-ios](https://github.com/vsouza/awesome-ios) が iOS 版に相当します。たくさんのライブラリが掲載されていますが、:large_orange_diamond: でマークされているものが Swift 製（あるいはObjective-Cブリッジによる）で、それ以外はほとんどの場合 Objective-C で作られていることを念頭に置いて探します。

    [![awesome_logo.png](https://qiita-image-store.s3.amazonaws.com/0/13842/c052dae8-c4de-de0f-5ef7-16f4481306d6.png)](http://awesomeios.com/)


2. リポジトリの状態を比較する
    スター数が多ければ良いライブラリであるという単純な考察はよくないのですが、スター数は人気度を表すバロメーターではあるので参考にします。issue の件数や、最終 commit 日時を見ると、そのライブラリがまだメンテナンスされているのかどうかが分かるのでこれも要確認です。

    > **スター数の比較**
    > <img width="981" alt="Screen Shot 2017-12-14 at 19.59.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/13842/0d299034-24aa-bad4-0b92-d74b6fc0c4e8.png">
    > <img width="981" alt="Screen Shot 2017-12-14 at 20.00.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/13842/2f7fbc6d-6eaf-a599-6999-6b2b195ef6e7.png">
    > ※ スター数はSnapKitのほうが多いけど、短く書ける記法の美しさから Cartography が僕のお気に入り。

    > **最終コミット日時の確認**
    > <img width="980" alt="Screen Shot 2017-12-14 at 20.01.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/13842/19052497-2d18-e483-a0bf-1bc5fd734742.png">
    > ※ `22 days ago`となっているので、比較的活発なんだなと判断したり。

3. Carthage に対応しているかどうか
    これまでパッケージ管理の主流といえば長らく [CocoaPods](https://github.com/CocoaPods/CocoaPods) が有名でしたが、[Carthage](https://github.com/Carthage/Carthage) の登場によりその立場も逆転しつつあります。導入には一手間かかりますが、ビルド時間を短縮することができるというメリットがあるため、パッケージ管理の主軸を Carthage にし、Carthage に対応していないライブラリに出会ったときだけ CocoaPods で入れてあげるスタイルで運用する人が増えているようです。

    > Carthage 対応のライブラリにはこんなバッジが README.md に記載されている
    > ![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)

4. （番外編）コミュニティを覗いてみる

    コミュニティでは雑談をはじめとしていろいろな情報が書き込まれますが、有用なライブラリに関する情報も流れてきたりするので、それをチェックしておくのも有効。
    - Slack: https://ios-developers.io/
        - 海外の方があつまるコミュニティ
    - Discord: https://medium.com/swift-column/discord-ios-20d586e373c0
       - 日本の方があつまるコミュニティ（界隈では名の知れた mono さんが立ち上げた:eyes:）

# おすすめライブラリ

## View

- [SnapKit](https://github.com/SnapKit/SnapKit)
    - AutoLayoutのライブラリ。まだ愛用していますが、Cartography に惚れたので乗り換えるつもり。
    - 前の会社に在籍してたときに使い方を解説した記事を書きました↓
        - [SnapKit を使いこなして楽チン AutoLayout](https://tech.ryukyu-i.co.jp/2016/12/02/easy-to-use-snapkit/)
- [Cartography](https://github.com/robb/Cartography)
    - AutoLayoutのライブラリ。
    - SnapKit に比べ短く書ける印象。比較演算子のオーバーロードを活用しているのが好き。

    > ```swift:Sample
    > constrain(halfView, halfView.superview!) {
    >   $0.top == $1.top
    >   $0.left == $1.left
    >   $0.right == $1.right
    >   $0.bottom == $1.centerY
    > }
    > ```
    >
    > superview に対して縦半分の大きさとなるように `halfView` の制約(Constraint)を設定してみた例
- [Chameleon](https://github.com/ViccAlexander/Chameleon)
    - `UIColor` のヘルパー。Hexによる初期化や、グラデーションが簡単に作れるのが良い。

    > ```swift:Sample
    > UIColor(hexString: "F9DF69")
    > ```

## Networking

- [Moya](https://github.com/Moya/Moya)
    - Alamofire のラッパー。APIとの通信部分を作るときなど、これを使うとだいぶラクすることができる。
- [Unbox](https://github.com/JohnSundell/Unbox)
    - Moya でAPIサーバーから受け取ったJSONをパースしてモデルにマッピングする際に重宝。SwiftyJSON なんかよりはるかに使いやすいと思う。（ただ、Swift 4 からは Codable を使ったほうがよりスマートかもしれない）
        - [[Swift 4] SwiftyJSONを使わずにシンプルにJSONをデータ構造化する ｜ Developers.IO](https://dev.classmethod.jp/smartphone/json-decoding-without-swiftyjson/)

## Debug
- [XCGLogger](https://github.com/DaveWoodCom/XCGLogger)
    - print デバッグをする際の定番。通常のprintとは違い、コードが実行された**ファイル名**や**行数**も出力してくれる。
    - 出力のフォーマットはカスタマイズが可能。

    > ```swift:Sample
    > let log : XCGLogger = {
    >   let logger = XCGLogger.default
    > 
    >   // フォーマットを設定（絵文字を使ってみたり）
    >   let formatter = PrePostFixLogFormatter()
    >   formatter.apply(prefix: "⚠️ ", postfix: " ⚠️", to: .warning)
    >   formatter.apply(prefix: "‼️ ", postfix: " ‼️", to: .error)
    >   formatter.apply(prefix: "💣 ", postfix: " 💣", to: .severe)
    >   logger.formatters = [formatter]
    >   
    >   logger.setup(level: .verbose, showThreadName: false, showLevel: false, showFileNames: true, showLineNumbers: true)
    > 
    >   return logger
    > }()
    > 
    > // ログ出力
    > log.debug("Foo Bar Baz") // 2017-12-14 21:36:12.066 [ViewController.swift:37] viewDidLoad() > Foo Bar Baz
    > ```
    > ※ `[ViewController.swift:37]` と出力されているので、`ViewController.swift` の 37行目という意味。

## Utilities

- [Then](https://github.com/devxoul/Then)
    - 初期化フェーズにおいてショートコーディングしたい人向けのマイクロライブラリ。
    - `.then {}` の中に更に `.then {}` をネストしたりすると Xcode の補完がうまく効かなくなったりすることもあるので注意。

    > ```swift:Thenを使わない場合
    > let label: UILabel = {
    >   let label = UILabel()
    >   label.textAlignment = .center
    >   label.textColor = .black
    >   label.text = "Hello, World!"
    >   return label
    > }()
    > ```

    > ```swift:Thenを使った場合
    > let label = UILabel().then {
    >   $0.textAlignment = .center
    >   $0.textColor = .black
    >   $0.text = "Hello, World!"
    > }
    > ```

- [SwiftyUserDefaults](https://github.com/radex/SwiftyUserDefaults)
    - `NSUserDefaults` のラッパー。ちょっとしたデータを永続化するときに。

    > ```swift:Sample
    > // キーを定義する
    > extension DefaultsKeys {
    >     static let username = DefaultsKey<String?>("username")
    > }
    > 
    > // 値を格納
    > Defaults[.username] = "Shun Tedokon"
    > 
    > // 値を取り出す
    > let username = Defaults[.username]
    > 
    > print(username) // Shun Tedokon
    > ```

- [SwiftFontName](https://github.com/morizotter/SwiftFontName)
    - `UIFont` に指定するフォント名が Xcode の補完で選べるようになるマイクロライブラリ。フォント名の文字列を手打ちせずに済みます。

    > ```swift:SwiftFontNameを使わない場合
    > UIFont(name: "HelveticaNeue-UltraLightItalic", size: 16)
    > ```

    > ```swift:SwiftFontNameを使った場合
    > UIFont(name: FontName.HelveticaNeueUltraLightItalic, size: 16)
    > ```
    > <img width="457" alt="Screen Shot 2017-12-14 at 21.08.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/13842/4f9a50dd-5c4e-122e-bf3f-76eb9b37a61b.png">

    > ※ `FontName.` まで入力したところで Xcode の補完が出てくる（便利）


力尽きてしまったので今日はこのへんで:relaxed: