RxSwift ファーストインプレッション

# RxSwift ファーストインプレッション

## はじめに

以前触ったことがあったObjective-C製のReactiveなライブラリとして[ReactiveCocoa(RAC)](https://github.com/ReactiveCocoa/ReactiveCocoa)がありますがObjective-Cで書かれてることもあって、マクロごりごりで組まれていてSwiftで書くとあまり書きやすいイメージがありませんでした。

なので今回は、よりSwiftの世界に歩み寄ったReactiveなライブラリということでRxSwiftを体験してみました。

## そもそもRxSwiftとは？

![6407041.png](https://qiita-image-store.s3.amazonaws.com/0/46751/ef4a438e-116f-f90c-f456-54f4fe2cbb7a.png)

[RxSwift](http://rxswift.org/)とは[ReactiveX (Reactive Extensions)](http://reactivex.io/)のSwift実装のライブラリで、よく名前を耳にするReactiveProgramming(RP)をSwiftの世界で実現してくれるものです。

ReactiveXはSwiftだけでなく様々なプログラミング言語でライブラリが存在しており、他のプラットフォームでもその概念を持ち込むことが可能です。

### 各プログラミング言語ごとのRxライブラリ一覧

| Language   | Library                                                  |
| ---------- | -------------------------------------------------------- |
| Java       | [RxJava](https://github.com/ReactiveX/RxJava)            |
| JavaScript | [RxJS](https://github.com/Reactive-Extensions/RxJS)      |
| C#         | [Rx.NET](https://github.com/Reactive-Extensions/Rx.NET)  |
| C#(Unity)  | [UniRx](https://github.com/neuecc/UniRx)                 |
| Scala      | [RxScala](https://github.com/ReactiveX/RxScala)          |
| Clojure    | [RxClojure](https://github.com/ReactiveX/RxClojure)      |
| C++        | [RxCpp](https://github.com/Reactive-Extensions/RxCpp)    |
| Ruby       | [Rx.rb](https://github.com/Reactive-Extensions/Rx.rb)    |
| Python     | [RxPY](https://github.com/ReactiveX/RxPY)                |
| Groovy     | [RxGroovy](https://github.com/ReactiveX/RxGroovy)        |
| JRuby      | [RxJRuby](https://github.com/ReactiveX/RxJRuby)          |
| Kotlin     | [RxKotlin](https://github.com/ReactiveX/RxKotlin)        |
| Swift      | [RxSwift](https://github.com/kzaher/RxSwift)             |

## 開発環境

* iOS 8.4
* Xcode 6.4

### Cocoapods

今回はサクッとRxSwiftを入れたかったのでCocoapodsを利用していきます。
なので以下のようなPodfileを作成しました、RxSwiftはdynamic libraryなので`use_frameworks!`を忘れないようにします。

```sh:Podfile
# Uncomment this line to define a global platform for your project
platform :ios, '8.0'
source 'https://github.com/CocoaPods/Specs.git'
use_frameworks!

pod 'RxCocoa'
pod 'RxSwift'
```

Podfileの作成が済んだら、作成したディレクトリで以下インストール用のコマンドをターミナルで叩きます

```sh
pod install
```

### Playground

動かすのもサクッといきたいのでPlaygroundでRxSwiftを利用できるように環境を作っていきます
Cocoapodsの準備が終わっているならば以下のようなファイル構成になっているはずなのでxcworkspaceを開きます

![スクリーンショット 2015-08-24 15.31.14.png](https://qiita-image-store.s3.amazonaws.com/0/46751/ac5ec2c1-ef87-fd79-01fd-a1aaa67d1065.png)

Xcodeが起動したらメニューから、`File > New > File...`の順で項目を選択

![](https://qiita-image-store.s3.amazonaws.com/0/46751/d21b2f6a-0191-e66c-3fd6-0135a4be5137.png)

Playgroundを選択してファイル名を入力して追加します

![](https://qiita-image-store.s3.amazonaws.com/0/46751/913e79e7-eb3a-5417-437a-b6b05e40e2f5.png)

ファイルの追加まで完了したならば追加したPlaygroundにRxSwiftとRxCocoaをimportします

```swift:Playground
import RxSwift
import RxCocoa
```

この段階でエラーが出てなければ開発環境の導入は完了です

## RxSwiftを体験

```swift
var a = 1
var b = a + 1
a = 10        // aを書き換える
println(b)    // => 11
```

Reactive Programmingの説明でよく使われる上記の例を実際にそうなるのかRxSwiftで書いてみます。

```swift:Playground
let a = Variable(1)
let b = combineLatest(a, Variable(1), +)

var ret: Int = 0
b >- subscribeNext { next in
    ret = next
}

println(ret)                             // => 2

a.next(10)                               // aを書き換える

println(ret)                             // => 11
```

aに対して加えた変更が計算結果に影響を与えていることが分かるので、Reactiveに動いてると言えますね。

今回動かしたサンプルをGitHubに挙げてます、リンクは[こちら](https://github.com/MOAPP-Sandbox/RxSwiftDemo)
（サンプルの方で確認したいときはCloneしてきて、ディレクトリ内で`pod install`すれば確認できます）

## おわりに

ReactiveX、RxSwiftともにまだまだ初学者ですが、RPを使いこなしてコードが組めるようになるとプログラマとして次のステップに行けるような気がしています。
あと単純に触っていて面白いので試しに遊ぶ分でも十分楽しめると思います、是非体験してみてください。

## Reactive Programmingについての参考リンク一覧

* [Introduction | ReactiveX](http://reactivex.io/documentation/operators.html)
* [Reactive manifesto](http://www.reactivemanifesto.org/ja)
* [【翻訳】あなたが求めていたリアクティブプログラミング入門 - ninjinkun's diary](http://ninjinkun.hatenablog.com/entry/introrxja)
* [「RxJS」初心者入門 – JavaScriptの非同期処理の常識を変えるライブラリ | LIG INC.](http://liginc.co.jp/web/js/151272)