iPadでアプリを作ってみる~Swift Playground 4.0~

# 初めに
サンタさんの正体を知ってからクリスマスがワクワクしなくなった気がします。どうもこんにちは、TOSHです！
クリスマスが近いですね！Appleから開発者に向けて、クリスマスプレゼントが届きましたね！そうです、Xcode13.2とSwift Playgrounds4です。
Async & Awaitのバックポートがされたり、iPadでの開発が可能になったりと、ますますエンジニアリングの可能性が広がったのではないでしょうか？
今回は、その中でもSwift Playgroundsについて紹介していこうと思います！

# SwiftPlaygroundsとは
元々は、iPadでSwiftを学習できるツールとして発表され、Swiftを使用してパズルを解きながらコードの基本をマスターすることができるツールとして登場しました。
そして、WWDC21でSwift Playgrounds上でアプリをビルドできるようになると発表されました。

## 必須環境
- iPad用アプリ「Playgrounds」 バージョン4.0以降
- iPadOS15.2以上(Playgroundsそのものはインストールできますが、Appを作成するためには15.2以上にする必要があります)
- Xcode13.2以上(Xcode上で開発を行う場合にのみ必要)

# Playgrounds
では実際に、Playgroundsのアプリを開いてみましょう。
最初の画面はこんな感じです。まだなんのプロジェクトも存在していないため、空っぽな状態です。
![IMG_0082.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180994/b054ad8f-f617-2f88-2ca7-bbe2a7dc6fb8.png)
実際に、アプリを作るにあたってAppleからサンプルアプリのようなものが既に用意されているので、どのように動くのかをみるためには、右下の「予定表」のアプリを選択してみるといいでしょう。
この画面は編集画面と呼ばれる画面なのですが、この画面では、SwiftUIのプレビュー機能も使用することができます。開発が捗りそうですね。
![IMG_0083.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180994/2e994ba5-b694-67aa-fdf4-ceb689665585.png)
編集画面上でrunボタンを押すことで、実際にiPad上でサンプルアプリを動かすこともできます。
![IMG_0085.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180994/8e2dcc1d-d6df-6eef-5429-e77c0b021633.png)
また、メニューボタンでは、アプリの停止をすることができたり、編集画面へと戻って修正後再度読み込みを行うこともできます。
![IMG_0086.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180994/e81d02ab-fb6b-a85b-6be9-eb28bd0caf08.png)
なかなか便利そうですね。思っていたよりちゃんとしたアプリを作成することができるようです。

# MyApp作成
では次にMyAppを作成してみましょう！MyAppを作成した瞬間で用意されるファイルは以下の通りになります。
![IMG_0084.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180994/08d08429-d225-bc07-dc66-65cecae2d86a.png)
`MyApp.Swift`と`ContentView.swift`のファイルしか用意されていません。では、Info.plistのような設定ファイルはどこにあるの？と思った人も多いでしょう。
App設定のボタンを押すことで下の画像のようなモーダルが立ち上がり、諸々の設定を行うことができます。
![IMG_CC6855E3EC89-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180994/37c06222-71c2-a872-0ffe-5406c4af6205.jpeg)
また、モーダル内の機能を追加を押すことによって、App Tracking PolicyやApp Transport Security、Core Location、カメラなどの機能へのアクセスを可能にしてくれます。

## アプリの配布方法
流れとしては、今までのアプリの配布と大きく変わる点はありません。
AppStoreConnectへアップロード→AppStoreからストアへの申請を行う
という流れになります。Swift Playgroundsでは、このAppStoreConnectへのアップロードがとても簡単に行えるようになっています。
![IMG_D9369E7CE22B-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180994/8239f05f-a003-4e1e-1fa4-a169bb29fc03.jpeg)
リリースを行うためには、
1. Appのアイコンをプレースホルダーからカスタムへと変更し、Appのアイコン画像をセットします。
2. チームをセットし、App固有の識別子であるバンドルIDを作成します。
3. ここまでを行った後、App Store Connectに選択します
これだけの手順で、AppStoreConnectにアプリのデータが上がります。Xcode上で設定するよりも幾分か簡単に行えるようになっていますね！

# SwiftPlaygroundでできること
先ほどの「予定表」のアプリを見ていただくと分かるように基本的なことはアプリ内で行うことができます。
また、アプリ内で作成できるものは、
- Swiftファイル
- フォルダ
- 画像のインポート
になります。ライブラリについては、Swift Package Managerを経由することで導入することができます。試しに、RxSwiftやswift-collections等のライブラリを入れてみましたが、問題なく入れることができました。

## UIKitは使える？
UIKitのソースコードについては、import UIKitを行うこともできますし、記述することもできます。
ただ、フルのUIKitでアプリを作成できるかというと正直わからないです。自分の環境で、APpDelegate等を書き換えて、UIViewControllerを呼び出してみたところ、viewDidLoadのメソッドは呼ばれているのですが、シミュレーター上での描画はなされていませんでした。SwiftUIとUIKitを自由に選択することができると言っている人も見かけたので、もしかしたらできるのかもしれません。。。

## Xcode上で動かすことってできるの？
できます〜。Xcode13.2以上が必要ではありますが、Xcode上でも問題なく修正を行うことができます。
iPad内で作成したプロジェクトはデフォルトではiCloudDrive内に`.swiftpm`というファイル形式で保存されるため、そのファイルをXcodeで開いてあげれば良いです。
では実際にこのようなディレクトリ構成のAppをXcode上で開いてみましょう。
![IMG_A61557FBEF7B-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180994/7e79e4b9-7758-eb9a-3ec0-8f1932e3fb30.jpeg)
こちらがXcode上で開いた時の画像です。
![スクリーンショット 2021-12-22 1.24.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180994/a59861f3-0bb6-4314-b56f-2d1fc2dc4a75.png)
基本的なフォルダ構成は変わっておりませんが、新たにAssetsというファイルが加わっているのが確認できます。この中には、アプリのAccentColorであったりAppIconのようなものが保存されております。

## gitでプロジェクト管理はできる？
iPad上では難しそうでした。そもそも、`.git`ファイルを作成すること自体が難しそうでしたので。またiPad内のアプリからgithubへpushするような仕組みもなさそうですね。
Xcodeからはというと、こちらは問題なくおこなえるようです。`.swiftpm`のフォルダのディレクトリまで移動し、`.git`ファイルを作成してあげると、問題なく`.swiftpm`内のファイルの差分を検出してくれていました。

## Appの実際のプロジェクトの中身ってどうなっているの？
実際に、`.swiftpm`ファイルの中身を見てみました。
![スクリーンショット 2021-12-22 1.35.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180994/968e6f99-eb02-52ef-edbb-28b6d36dc5fd.png)
PlaygroundsアプリやXcode上からは見えませんでしたが、どうやらいくつかのplistファイルを持っているようですね。それぞれのplistの中身もみてみましたが、特に重大そうな設定が書かれているわけでもありませんでした。
また、`playgrounds`と同じ階層にある、`xcode`のディレクトリはiPad内でアプリを作成した際には存在せず、Xcode上で開いた場合に生成されるディレクトリのようでした。ちなみに中身はこのようになっています。なんとなく`xcworkspace`を持っているのは合点がいきそうですね。
![スクリーンショット 2021-12-22 1.39.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180994/43bed7c9-4cde-b880-f465-53998d21c1d4.png)

## Scribbleを使用してコードを手書きできる？
無理そうでした。まあ、コードを手書きできても、書きづらそうではありますが。。。

## iPadでも補完機能はある？
あります。Xcodeほど使いやすいものではないですね。一応ビルド前のワーニングやエラーも吐いてくれるようです。

# まとめ
思っていたより、完成度が高くなっていて驚きました。現状いい感じにUIKitが使用できるのかが不明なのでなんとも言えない部分ではありますが、SwiftUIを使用した個人制作のアプリレベルであれば、頑張れば作成できるような気がしますね。
結構使っていて楽しいので、皆さんもぜひ、試してみてください！