Framework ProjectをPlaygroundで動作確認する方法

## 前説
OSS内にPlaygroundが含まれている場合、そのPlaygroundを弄って動作を確認することは容易です。しかし、Playgroundは、含まれていないけどPlayground上で動作を軽く確認したい！

軽く確認するためにTest Project作ってPodsやCarthageでOSS引っ張ってくるのはしんどいということ…ありませんか？

もしくは、オリジナルの神Frameworkを作ったから、Playground上で動作確認したい…そういうことありませんか？

そういった軽く動きをPlayground上で確認する方法をご紹介します。

## 材料
* Playgroundで動作確認したいFramework Project (例 Alamofireや神Framework等)
* Xcode (Xcode 8系以降ならほぼ同じ手順で可能なはずです。)

今回は、下記環境を使って説明していきます。

* Almofire 4.7.2
* Xcode 9.3

## 1. Workspaceを作る
既にFramework Projectの方で`*.xcworkspace`(画像赤い点線) が用意されている場合、それが使えるので次のステップへ。

![スクリーンショット 2018-05-23 23.05.32.png](https://qiita-image-store.s3.amazonaws.com/0/154832/cb6beb87-297a-5df6-f755-580a2c86432a.png)

#### WorkspaceがないProjectは、Workspaceを作ります
1. Workspaceを作りたいFramework Projectを開く
2. Menuから`File`>`Save As Workspace...`を選択
![スクリーンショット 2018-05-23 23.11.03.png](https://qiita-image-store.s3.amazonaws.com/0/154832/879e6e91-8a43-38c1-48bc-fdfc320ffd90.png)
3. Workspaceを保存する
![スクリーンショット 2018-05-23 23.12.08.png](https://qiita-image-store.s3.amazonaws.com/0/154832/8e9218e2-f47b-95dc-a51b-485e02a2b54e.png)

## 2. Playgroundを作り、Workspaceに追加する
Playgroundを作り、Workspaceに追加してProject上で参照できるようにします。

1. `*.xcworkspace`をXcodeで開く
2. Menuから`File`>`New`>`Playground...`を選択
![スクリーンショット 2018-05-23 23.13.58.png](https://qiita-image-store.s3.amazonaws.com/0/154832/1ef3a4fe-9dd5-e2c1-a0b0-59ea77bedd18.png)
3. Playgroundを保存する
![スクリーンショット 2018-05-23 23.14.27.png](https://qiita-image-store.s3.amazonaws.com/0/154832/72a63ab1-535f-87a8-f609-e6ad9e798958.png)
4. 開いているWorkspaceに対してMenuから`File`>`Add Files to "Project Name"...`を選択
![スクリーンショット 2018-05-23 23.14.49.png](https://qiita-image-store.s3.amazonaws.com/0/154832/c3bf3171-b8fd-7345-54d8-db57101e4f87.png)
5. 「2.」「3.」で作成したPlaygroundを選択
![スクリーンショット 2018-05-23 23.15.14.png](https://qiita-image-store.s3.amazonaws.com/0/154832/09f221cd-6fee-a8ed-01b5-0eff0dbd8d51.png)

## 3. Framework Projectをbuildと動作確認
今回Playground上で実行させるコードは下記で、簡単に説明すると英語のwikipediaからJSONで情報を取ってくる内容になっています。

```swift:実行コード
import Alamofire

print("=== start ===")
// url
var url = "https://en.wikipedia.org/w/api.php"

// parameters
var parameters: Parameters = [
    "action" : "query",
    "format" : "json",
    "titles" : "oryzae"
]

Alamofire.request(url, method: .get, parameters: parameters)
    .responseJSON { response in
        print(response)
}

print("=== end ===")
```

しかし、この時点ではまだ下記のようにerrorが出て、Framework Projectで実装されたコードをPlayground上で実行できません。

![スクリーンショット 2018-05-24 0.39.14.png](https://qiita-image-store.s3.amazonaws.com/0/154832/c4118beb-2155-3eb6-7bf3-91a09142186d.png)

#### Playground上でimportできるようにFrameworkを作成
1. 任意のSimulatorを選択してbuild<br>※**`Generic iOS Device`の場合、build errorになるので必ずSimulatorを選ぶこと**
2. buildによりFrameworkが作成され、Playgroundでimport&実行が可能に

![スクリーンショット 2018-05-24 0.15.04.png](https://qiita-image-store.s3.amazonaws.com/0/154832/be55d48a-2777-b134-a136-2905176b602e.png)

## EX. Playgroundで非同期処理も実行
Playgroundでerrorが表示されていないので、Alamofireも実行されている！やったね✌️…と、よくみるとAlamofireのresponse内の`print`がログに表示されていない。

実はPlaygroundは、上から順に同期処理を行い、最後の行に到達したら処理を終了するため、非同期処理は実行されない。

非同期処理も行わせるためには、下記の`// 追加`と書いた部分をPlaygroundに追加する必要がある。

```swift:実行コード
import Alamofire
import PlaygroundSupport // 追加

// 非同期処理を実行させる
PlaygroundPage.current.needsIndefiniteExecution = true // 追加

print("=== start ===")
// url
var url = "https://en.wikipedia.org/w/api.php"

// parameters
var parameters: Parameters = [
    "action" : "query",
    "format" : "json",
    "titles" : "oryzae"
]

Alamofire.request(url, method: .get, parameters: parameters)
    .responseJSON { response in
        print(response)
}

print("=== end ===")
```

`PlaygroundPage.current.needsIndefiniteExecution`は、名前の通り非同期処理の実行が必要かどうかを持つPropertyである。default値は`false`なので意図的に`true`にしてやる必要がある。

これで、非同期処理含めFrameworkの処理をPlaygroundで実行出来たーやったね👍

![スクリーンショット 2018-05-24 0.16.33.png](https://qiita-image-store.s3.amazonaws.com/0/154832/f498a5ba-6ee4-cc2c-fbed-7655f4ae3f99.png)