前説
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
(画像赤い点線) が用意されている場合、それが使えるので次のステップへ。
WorkspaceがないProjectは、Workspaceを作ります
2. Playgroundを作り、Workspaceに追加する
Playgroundを作り、Workspaceに追加してProject上で参照できるようにします。
-
*.xcworkspace
をXcodeで開く - Menuから
File
>New
>Playground...
を選択
- Playgroundを保存する
- 開いているWorkspaceに対してMenuから
File
>Add Files to "Project Name"...
を選択
- 「2.」「3.」で作成したPlaygroundを選択
3. Framework Projectをbuildと動作確認
今回Playground上で実行させるコードは下記で、簡単に説明すると英語のwikipediaからJSONで情報を取ってくる内容になっています。
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上で実行できません。
Playground上でimportできるようにFrameworkを作成
- 任意のSimulatorを選択してbuild
※Generic iOS Device
の場合、build errorになるので必ずSimulatorを選ぶこと - buildによりFrameworkが作成され、Playgroundでimport&実行が可能に
EX. Playgroundで非同期処理も実行
Playgroundでerrorが表示されていないので、Alamofireも実行されている!やったね✌️…と、よくみるとAlamofireのresponse内のprint
がログに表示されていない。
実はPlaygroundは、上から順に同期処理を行い、最後の行に到達したら処理を終了するため、非同期処理は実行されない。
非同期処理も行わせるためには、下記の// 追加
と書いた部分をPlaygroundに追加する必要がある。
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で実行出来たーやったね👍