iPadのSwift Playgroundsだけでswift初心者の高校教師がアプリの開発に挑戦してみる　＜その4＞

https://qiita.com/kerikerijy/items/0751ee5661011a88b368

# 開発したいアプリは「席替えアプリ」

実は、私がSwift Playgroundsだけで作りたいアプリはもう決めていました。

「席替えをする」アプリです。

理由はいくつかあります。

1. 初めてつくるには、難易度的にちょうど良さそう
2. 参考にできそうなプレイグラウンドがいくつかある
3. それなりに需要はありそう
4. 機能を追加していけそう(拡張性がある)

## 実現性

https://qiita.com/kerikerijy/items/38ddbc93ae62c84351b8

初めての記事にも書いた通り、私はC言語だけはすこし分かるものの、GUIを伴うアプリケーションの開発というものは全くしたことがありません。ですので、最初からあまりにも複雑そうな機能を含んだアプリを開発する自信は到底ありません。
私と同様に最終的には高校生の生徒たちにもSwift Playgroundsだけで学びながら作ってほしいという目的があるので、まずは先駆者の私がある程度の短期間で最低限動作するものに辿り着く必要があると考えました。

ある程度の短期間と書きましたが、具体的には一応1ヶ月程度を目標にしておくことにしました。

とはいえ、「Appギャラリー」にあるプレイグラウンド「プロフィール」のような情報を表示するだけのものでは面白くありません。

![04D1F543-C00F-4C39-A427-99AE8A0B2654.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661763/eaebe246-22f8-3031-9869-b31d4bb71e5b.jpeg)

<iframe width="560" height="315" src="https://www.youtube.com/embed/-w_WI2kMXxg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

プロフィール情報を複数のタブビューに表示するアプリ

「席替え」という機能を実現するには、なんとなくですが、配列を用いて生徒や座席の情報を管理しないといけなさそうなので、「コードを学び、Appを作る」にあるプレイグラウンドで学んなこを活かして作るには難易度的にもちょうど良さそうで、これくらいならなんとか私でも実現できるのではないかと思ったのです。

![F07F1D8C-CE81-416A-812B-3F8CF79D1F8F.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661763/7b7c6c0d-b4ae-4891-2e89-5b2b255f9eed.jpeg)

## 参考にするプレイグラウンド

### コードを学び、Appを作る

- コードを学ぼう1
- コードを学ぼう2

この2つのプレイグラウンドで、プログラミングに関する一般的な用語と概念、コードをデバッグする方法を身に付けることができます。

しかしながら、アプリのUIを作成するためのプログラミングは学ぶことはできません。

UIとは、ユーザーインターフェースのことで、ユーザーがアプリから情報を受け取ったり、アプリを操作する手段のことです。
要するに画面に表示される画像イメージ、テキスト、ボタンなどのことだと思っておけば良いと思います。

- Appの作成を始めよう

このプレイグラウンドで、SwiftUIの基本を少し学び、UIを少しだけ組み立てることができるようになります。

画面の右上のガイドボタンを押して、順にタスクに取り組むことで、実際にコーディングしながら学ぶことができます。コーディングの結果はプレビューボタンを押して確認することができます。

![416B0E79-7185-443A-A412-B0FA9540024B.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661763/86c89ca4-5270-bb4a-a05e-e0faeecf39d4.jpeg)

### Appギャラリー

- プロフィール

前述の通り、プロフィール情報を表示するプレイグラウンドです。主に、タブ付きインターフェースの設定方法やアプリ内のデータの管理方法が学べます。

- イメージギャラリー

![C1145283-9C82-4242-A83F-14A6A6F709EF.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661763/d3d58a89-5dda-393a-b6d6-41d717529869.jpeg)
![398F3289-69C6-4EE4-9762-960057DF1A7D.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661763/30b7836b-8221-d1f1-6567-7b69230e1eb3.jpeg)

写真選択機能や写真編集機能を備えたイメージのグリッドの作成方法が学べます。

「席替えアプリ」のUI作成に参考にできそうなコードがたくさんありました。
特に、ScrollViewやLazyVGridを使用した必要に応じて縦にスクロールするグリッドの作成、GeometryReaderを使用した各グリッドのサイズ調整は座席表のUIにそのまま使えそうだと思いました。

備忘録的に引用しておきます。

>```swift:GridView
>            ScrollView {
>                LazyVGrid(columns: gridColumns) {
>                    ForEach(dataModel.items) { item in
>                        GeometryReader { geo in
>                            NavigationLink(destination: DetailView(item: item)) {
>                                GridItemView(size: geo.size.width, item: item)
>                            }
>                        }
>                        .cornerRadius(8.0)
>                        .aspectRatio(1, contentMode: .fit)
>                        .overlay(alignment: .topTrailing) {
>                            if isEditing {
>                                Button {
>                                    withAnimation {
>                                        dataModel.removeItem(item)
>                                    }
>                                } label: {
>                                    Image(systemName: "xmark.square.fill")
>                                                .font(Font.title)
>                                                .symbolRenderingMode(.palette)
>                                                .foregroundStyle(.white, .red)
>                                }
>                                .offset(x: 7, y: -7)
>                            }
>                        }
>                    }
>                }
>                .padding()
>            }
>```
>```swift:GridItemView
>struct GridItemView: View {
>    let size: CGFloat
>    let item: Item
>
>    var body: some View {
>        ZStack(alignment: .topTrailing) {
>            if let url = item.url {
>                AsyncImage(url: url) { image in
>                    image
>                        .resizable()
>                        .scaledToFill()
>                } placeholder: {
>                    ProgressView()
>                }
>                .frame(width: size, height: size)
>            }
>        }
>    }
>}
>```

### Appを拡張する

- グリッドを使った整理
- グリッドの編集

![287D66D0-6C21-4421-9DBC-4D58C1617D32.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661763/c2b9e001-85eb-85f8-075a-6f410858cb1a.jpeg)

この2つのプレイグラウンドも前述のイメージギャラリーと同様にグリッドに関するプログラミングの知識を中心に学ぶことができます。
というか、「イメージギャラリー」よりも前にこの2つのプレイグラウンドで学ぶ方が効率が良いと思いました。難易度的にはこの2つより「イメージギャラリー」の方が上です。

「グリッドを使った整理」では、カラーの四角形のグリッドを使ってアプリのUIをレイアウトしてコンテンツを整理する方法と、状態変数を使ってそのグリッド内のカラーを追跡する方法について説明されています。色、図形、ボタン、状態変数に関する基礎知識などを学ぶことができます。

![94E562DD-0773-42E4-8C2C-BD563B3B4FA0.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661763/2042fdc4-fdf2-3620-d97f-3918782267a6.jpeg)

「グリッドの編集」では、NavigationViewを使ってアプリにナビゲーションを追加する方法と、アプリ内に保存するデータを編集できるようにすることを学ぶことができます。

![44E398D5-3D0E-4706-BB81-54818D7FA4D6.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661763/352b5f38-fcf1-7f59-6e42-359055d5263e.jpeg)

また、SF SymbolsというAppleが提供しているシンボルフォントの存在について知ることができます。文字列に関連付けられたSF Symbolsを使って作成したイメージをアプリ内のボタンなどのデザイン使用することはアプリ開発の大きな助けとなると思いました。以下の記事も大変参考にさせて頂きました。

https://dev.classmethod.jp/articles/howtoenjoy-sfsymbols/

## 既存アプリの調査

席替えに関するAppがどのくらい、どのようなものあるのかもざっと調べてみました。

![5A2532AD-6AF0-44BF-B0FD-5661E4368A22.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661763/ee431c84-f995-411d-d441-b3814b0b96ff.jpeg)

App Storeで検索したところ、無料で使用できるものは5、6個あり、個々には述べませんが、大体、以下のような感じでした。

### 設定項目

- 座席情報
行数、列数、配置

- 生徒情報
人数、番号、氏名（漢字、ふりがな）

### 機能

- ランダムに席替え
- ある生徒の席を固定する
- 男女の席を固定する
- 設定した生徒情報を記憶する
- 座席表を出力する

意外と種類があるなとは思いました。ですが、偉そうなことは言えませんが、正直使いにくいという印象を受けるものが多かったです。
設定項目が多くて席替えするまでに時間がかかったり、直感的に操作が分かりにくいためです。

自分が作るものは、機能は最低限にして直感的に使いやすくしたいと思いました。

今回はここまでにします。次回から本格的に開発する席替えアプリの機能設定とUI設計をしてみたいと思います。

https://qiita.com/kerikerijy/items/c667645df4e4a0074f76