Realm や Alamofire など、GUI を必ずしも必要としないフレームワーク(ライブラリ、あるいはAPI)を試すだけのために、ViewController.swift の viewDidLoad() に長々とテスト用のコードを記述するのは少し気がひけるものです。
また、テストコードをいくつか作成して比較するためだけに、新規プロジェクトをいくつも作成し、それらを相互に比較するのもなかなか大変です。
Playground でテスト用のコードをいくつも作成できれば良いのですが、外部フレームワークは Playground に直接インポートすることができません。しかし、実は少しの工夫で Playground でも Realm や Alamofire などのフレームワークを使うことができるようになります。
ここでは、その方法についてご紹介したいと思います。
作業の流れ
Playground で外部のフレームワークを使うためには、次のような作業が必要となります。
- 通常通り、iOS App のプロジェクトを作成する。
- Podfile を作り、必要なフレームワークをインストールする。
- 先ほど作ったプロジェクトを一度終了し、拡張子が xcworkspace となっているプロジェクトを開く
- 一度 Build を実行し、Podfile で追加したフレームワークをコンパイルしておく。
- Playground をプロジェクトに追加する。
- Playground で目的のフレームワークをインポートする。
カンが良い方はここまでの記述でご理解頂けると思いますが、念のため詳しい流れを以下で説明したいと思います。
プロジェクトの作成
Xcode を起動し、通常通りプロジェクトを作成します。
一つのプロジェクトで複数の Playground を追加できますので、”RealmTest” など、汎用的な名前で作成してもいいかもしれません。
プロジェクトが立ち上がったら、そのプロジェクトは一度閉じておきます(プロジェクトを閉じれば、Xcode 自体は終了させる必要はありません)。
Podfile の作成とフレームワークのインストール
この辺りの作業は、通常の cocoapods のインストールと同じです。
まず、
1 |
% pod init |
で Podfile を作成します。
次に、適切なエディタで Podfile を開き、追加したいフレームワークを記述します。
記述後はエディタを終了させ、
1 |
% pod install |
でフレームワークをインストールします。
インストールが完了したら、拡張子が
xcworkspace になっている方のプロジェクトを立ち上げます。
ちなみに、プロジェクト名が
RealmTest.xcworkspace であれば、
1 |
% open RealmTest.xcworkspace |
という具合に、 open コマンドを使うことで自動的に Xcode で起動させることも可能です。
フレームワークのビルド
再度プロジェクトが起動したら、一度フレームワークをビルドしておきます。
Cmd + Bもしくはメニューの [Product] から [Build] を選択し、追加したフレームワークをコンパイルしておきます。
この手順は必須ではありませんが、一度ビルドしておくことで、Xcode が提案する候補に目的とするメソッドやプロパティが出やすくなります。
Playground ファイルの追加
プロジェクトに Playground を追加します。
追加方法はいくつかありますが(そのうち一つは [File] から [New] , [File] の順番で選ぶ方法)、追加するフォルダを直感的に決められるという観点からは、ファイルナビゲータ上で操作する方法が簡単かと思います。
ファイルナビゲータ上に表示されたファイル階層のうち、追加したい場所で Ctrl + クリック を実行します。
たとえば、プロジェクタのフォルダ内に追加するのであれば、フォルダ名の部分でクリックします。
メニューが開きますので、[New File…]を選びます。
表示されるファイル一覧には Playground は表示されていませんが、実はここに表示されているファイル一覧はスクロールさせることが可能です(スライダが見えないので分かりにくいのですが)。
下の方にスクロールさせると [Blank Playground] が見つかりますので選択し、[Next] を押します。
必要に応じて、適切なファイル名をつけてください。
基本的にはファイル名だけ変更すれば大丈夫ですが、必要に応じて他の設定も行うようにしてみてください。
これで、プロジェクトに Playground が追加されました。
Playground 上でコードを記述し、実行する
あとは、インポートしたいフレームワークをインポートし、通常の Playground と同じく▶︎ボタンを押して実行するだけです。
これだけの作業で、Playground 上でも任意のフレームワークを使うことができるようになりますので、心ゆくまで実験したいと思います。
フレームワーク別の注意点
実際に Playground でコードを記述する際に気づいた点をまとめておきたいと思います。
Realm の実行
Realm は、通常記録するデータはファイルとして保存するようになっていますが、Playground の場合はファイルの作成ができませんので、インメモリで実行する必要があります。
具体的には、Realm のインスタンスを作成する際に、次のような設定を行うことでインメモリでの実行が可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
import RealmSwift // メモリ上の Identifier を設定し、Realm を初期化する let config = Realm.Configuration(inMemoryIdentifier: "inMemory") let realm = try! Realm(configuration: config) // 以下は実行サンプル class Dog: Object { @objc dynamic var name: String = "" @objc dynamic var age: Int = 0 } let myDog = Dog() myDog.name = "Jiro" myDog.age = 1 let yourDog = Dog() yourDog.name = "Taro" yourDog.age = 3 try! realm.write { realm.add([myDog, yourDog]) } let allDogs = realm.objects(Dog.self) print("AllDogs:", allDogs) //AllDogs: Results<Dog> <0x7f8c98008980> ( // [0] Dog { // name = Jiro; // age = 1; // }, // [1] Dog { // name = Taro; // age = 3; // } //) let youngDogs = realm.objects(Dog.self).filter("age < 3") print("YoungDogs:", youngDogs) //YoungDogs: Results<Dog> <0x7f8c9800a430> ( // [0] Dog { // name = Jiro; // age = 1; // } //) |