【Swift】CarthageでRxSwiftをインポート

# はじめに
本記事では、ライブラリ管理ツールであるCarthageをMacにインストールし、RxSwiftをプロジェクトにインポートします。

#環境
Mac OS 10.13.6(High Sierra)
Homebrew 1.7.5
Xcode 10.0
Swift 4.2

#Homebrewのインストール
まずHomebrewをインストールしていきます。
<img width="934" alt="スクリーンショット 2018-09-21 00.33.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/77845/ae5cb3c4-59d8-93fd-040e-e5f8b63bd4f8.png">

最初に書いてあるコマンドをターミナルにコピペします。

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```


インストールが終了したら、バージョンの確認

```
brew -v
```
これでHomebrewのインストールは完了です。

#carthageのインストール
続いてcarthageのインストールを行なっていきます。

[carthageのREADME](https://github.com/Carthage/Carthage)に記載してある以下のコマンドをターミナルで実行します。

```
brew install carthage
```

#carthageの導入
carthageを以下の手順で、プロジェクトに導入します。

- Cartfileの生成
- Cartfileの編集
- ライブラリのインストール
- Xcodeのプロジェクトにライブラリの導入 

##Cartfileの生成
導入するXcodeプロジェクトのディレクトリに移動して、Cartfileを生成します。

```
cd /YOUR_XCODE_PROJECT
touch Cartfile
```

これでCartfileの生成ができました。

##Cartfileの編集
続いて生成したCartfileの編集を行います。

```
vi Cartfile
```

[RxswiftのREADME](https://github.com/ReactiveX/RxSwift)に記載されている以下をCartfileに追加します。

``` Cartfile
github "ReactiveX/RxSwift" ~> 4.0
```

#ライブラリのインストール
Cartfileに追加したライブラリのインストールを行います。

```
carthage update
```

OSを指定したい場合は、以下のようにOSを指定してインストールします。

```
carthage update --platform ios
```

以下のようなエラーが発生する場合があります。

```
xcrun: error: unable to find utility "xcodebuild", not a developer tool or in PATH
```

この場合は、Xcodeの設定で、Command Line Toolを設定する必要があります。

<img width="416" alt="スクリーンショット 2018-09-22 15.55.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/77845/edde9663-8109-fd6d-5568-b3d8ef0188ba.png">

<img width="802" alt="スクリーンショット 2018-09-22 15.58.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/77845/1d7c6d45-222d-70cd-f840-b96f6d77ad07.png">

エラーが出た場合は、設定後に再度

```
carthage update --platform ios
```
行います。

プロジェクトのディレクトリ内にBuildディレクトリとファイルがインポートされれば成功です。



これでライブラリのインストールが完了しました。


#Xcodeプロジェクトにインポート

ビルドしたライブラリをXcodeプロジェクトにインポートします。

プロジェクトファイル > General を選択します。
Linked Frameworks and Librariesのプラスボタンから、Carthage/Buildに入っているRxSwift.frameworkを追加します。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/77845/099e537f-87ce-9631-bcae-64789a2a3bc4.png)

![2.png](https://qiita-image-store.s3.amazonaws.com/0/77845/0ba1cfa9-a669-bec7-110b-b4afc15bd711.png)

![3.png](https://qiita-image-store.s3.amazonaws.com/0/77845/fc3600fa-d99b-54e5-b7b2-c8d7b7041843.png)



続いて、プロジェクトファイル > Build Phases
の左上のプラスボタンからNew Run Script Phaseを選択し、新しいRun Scriptを作成します。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/77845/413fd726-cfba-2cf9-8e73-0a93665d2921.png)

以下のように新しいRun Scriptがつくられます。

<img width="1086" alt="スクリーンショット 2018-09-24 20.41.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/77845/6a07951e-9adc-e2fc-7102-dd97eb4a3d34.png">


Run Scriptの

```
# Type a script or drag a script file from your workspace to insert its path.
```
に以下のスクリプトを追加します。

```
/usr/local/bin/carthage copy-frameworks
```

<img width="1090" alt="スクリーンショット 2018-09-24 20.43.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/77845/6a36b855-4c5a-8121-e604-d0e5770f109e.png">

続いて、該当のライブラリをInput Filesにプラスボタンから追加していきます。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/77845/0f17a2c9-8716-8dd3-0cae-aebbd79699fe.png)

プラスボタンを押すと、Input Filesに

```
$(SRCROOT)/newInputFile
```

が追加されます。こちらを変更します。

newInputFileをCarthage/Build/iOS/RxSwift.frameworkとライブラリを指定します。

<img width="1087" alt="スクリーンショット 2018-09-24 20.59.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/77845/0da047b0-e822-c524-f6f8-e2292ed06610.png">

必要であれば、同じようにRxCocoaも追加します。

追記：
<img width="809" alt="スクリーンショット 2019-01-29 22.46.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/77845/8488614f-0508-6897-692c-99fe4c70f8b7.png">


#コントローラーに追加
これでRxSwiftを使用することができるようになりました。
ViewControllerにインポートして使用します。

```ViewController.Swift
import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController {
    @IBOutlet weak private var button: UIButton!
    private let disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        button.rx.tap
            .subscribe({ _ in
                // do something
            })
            .disposed(by: disposeBag)
    }
}

```

#サンプルプロジェクト
こちらサンプルです。
https://github.com/hananao/Carthage_RxSwift_import

#その他
間違っている点などありましたら、コメントをお願いします。