【iOS】今年使ってみて良かったライブラリ4選

こんにちは、マネーフォワードでiOSエンジニアとして働いている杉本です。
私の方からは今年試してみて便利だったライブラリを紹介しようと思います。

## RealmSwift
### RealmSwiftとは 
1つ目は今年話題になったRealmSwiftというライブラリです。
RealmSwiftはRealmをSwiftから使うためのライブラリで、Coredataに近い存在です。

RealmとはSQLiteを置き換えると言われているモバイルDBです。
去年に出たばかりなのですが、リリース9ヶ月で世界2位のモバイルDBにまで成長したという期待のライブラリです。

[realm/realm-cocoa](https://github.com/realm/realm-cocoa)

### RealmSwiftの長所
RealmSwiftですが、Coredataと比べるとテーブル定義とても簡単です。

Coredataでは`xcdatamodel`ファイルにModel定義をした上でそれに対応するクラスを作る必要があったのですが、Swiftではクラス定義するだけでModel定義が完了します。

`xcdatamodel`で良くあったNotNull入れ忘れなどもなくなりそうで有り難いです。

### Coredataでのクラス定義
![スクリーンショット 2015-11-30 20.55.20.png](https://qiita-image-store.s3.amazonaws.com/0/61598/783ed64d-b61a-cb21-07bb-ec19af4cdf30.png)

### Swiftでのクラス定義
```swift
import RealmSwift

class User: Object {
    dynamic var id = 0
    dynamic var name = ""
    
    override static func primaryKey() -> String? {
        return "id"
    }
}
```

それとマイグレーションがとてもお手軽です。
Coredataでは、`xcdatamodel`の新しいバージョンを作成・対応するクラスの修正・旧バージョンと新バージョンの紐付けファイルを作る必要がありました。
Realmでは対応するクラスの修正と下のようなマイグレーション設定を記述するだけで済みます。

```swift
let config = Realm.Configuration(
    schemaVersion: 1,
    migrationBlock: { migration, oldSchemaVersion in
        if (oldSchemaVersion < 1) {}
})
Realm.Configuration.defaultConfiguration = config
```

詳しい使い方はこちらにもまとめたので宜しければ合わせて御覧ください。

[RealmSwiftを試したけどもうCoreDataは使わなくなるかもしれない](http://llcc.hatenablog.com/entry/2015/06/08/013811)
[Realm Swiftのマイグレーションを試してみた](http://llcc.hatenablog.com/entry/2015/08/22/183019)

## LKUserDefaults
これはUserDefaultsにプロパティー形式でアクセスできるライブラリです。
下のようにget/setができます。

```swift
print(UserDefaults.sharedInstance().hoge) // getter
UserDefaults.sharedInstance().hoge = "hoge" // setter
```

しかしプロパティーの定義はObjective-cでしかできないという点がネックです。
Objective-cは人によっては嫌だったりするのでチームで使うのは少しためらっています。

プロパティー定義は下の通りです。

```swift
@interface UserDefaults : LKUserDefaults

@property(nonatomic, nonnull) NSString *hoge;

@end
```

デフォルト値を持たせたい場合は実装ファイルに下のような記述をします。

```swift
@implementation MyUserDefaults

- (void)registerDefaults {
    self.hoge = @"defaultValue";
}

@end
```

## SwiftDate
NSDateを拡張してくれるライブラリです。
SwiftのNSDateってmonthを取るだけでNSDateComponentsのインスタンス生成が必要だったり、Stringにしたい時はNSDateFormatterを使ったりと色々めんどくさいです。
SwiftDateはNSDateを拡張してその辺を使いやすくしてくれます。

年/月/日などの取得を直感的にできるようになります。

```swift
import SwiftDate

NSDate().year
NSDate().month
NSDate().day
```

"YYYY/MM/dd"形式での出力も1行でできます。

```swift
NSDate().toString(format: .Custom("YYYY/MM/dd"))
```

1日後のNSDateや3時間前のNSDateも簡単に取れます。
個人的に一番気に入っている機能です。

```swift
import SwiftDate

NSDate() + 1.day
NSDate() - 3.hours
```

## R.swift
StoryboardやSegue等を変数として取得できるライブラリです。
非常に気に入っているライブラリで、今年は周囲に布教していました。

Storyboardは下のように置き換えてくれます。
嬉しいことに`MyViewController`へのキャストもしてくれます。

```swift
let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() as? MyViewController
// ↓ のように書ける
let viewController = R.storyboard.main.initialViewController
```

segueは下のように書けます。

```swift
performSegueWithIdentifier("OpenSettings")
// ↓ のように書ける
performSegueWithIdentifier(R.segue.viewController.openSettings.identifier)
```

prepareForSegueでも変数を使えるようになるのが嬉しいです。

```swift
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
//     if segue.identifier == "OpenSettings" {
    // ↓ のように書ける
    if segue.identifier == R.segue.viewController.openSettings.identifier {
        // ...
    }
}    
```

他にも Nib/Reuse Identifier/UIImage/Font などを変数として扱えます。
下の記事でも詳しい使い方を書いたので宜しければご参照下さい。

[R.swiftを使ってStoryboard名や画像名のTypoを0にする](http://qiita.com/shimesaba/items/e7832b2559c3c89caff1)

## 参考URL
[BuzzFeedやチャットワークも導入、1億台のデバイスで動作するモバイルDB「Realm」がシリーズBで2000万ドルを調達](http://thebridge.jp/2015/03/realm-raises-20-million)