面白きことは良きことなり

拙く未熟なiOSエンジニアの備忘録と戯言

OSSのような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(画像赤い点線) が用意されている場合、それが使えるので「2.」へ。

f:id:aryzae:20180523235302p:plain

WorkspaceがないProjectは、Workspaceを作ります

  1. Workspaceを作りたいFramework Projectを開く
  2. MenuからFile>Save As Workspace...を選択 f:id:aryzae:20180523235028p:plain
  3. Workspaceを保存する f:id:aryzae:20180523235031p:plain

2. Playgroundを作り、Workspaceに追加する

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

  1. *.xcworkspaceXcodeで開く
  2. MenuからFile>New>Playground...を選択 f:id:aryzae:20180523235035p:plain
  3. Playgroundを保存する f:id:aryzae:20180523235039p:plain
  4. 開いているWorkspaceに対してMenuからFile>Add Files to "Project Name"...を選択 f:id:aryzae:20180523235043p:plain
  5. 「2.」「3.」で作成したPlaygroundを選択 f:id:aryzae:20180523235048p:plain

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上で実行できません。

f:id:aryzae:20180524001045p:plain

Playground上でimportできるようにFrameworkを作成

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

f:id:aryzae:20180524001533p:plain

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で実行出来たね。

f:id:aryzae:20180524001933p:plain