BLOG

ブログ

2025/08/25 技術系

初めてのSwiftUIでTodoアプリ開発!学んだ5つのこと

この記事を書いた人 M.H

こんにちは!M.Hです。
StoryboardでのiOSアプリ開発に慣れ親しんだ私が、初めてSwiftUIを触ってみました。
簡単なTodoアプリ作りでさえ、Auto LayoutやIBOutletといった“当たり前”が覆される良い体験でした!
この記事では、Storyboard経験者だからこそ感じるSwiftUIの良いところと学びを書いていきます。

作成したアプリは非常にシンプルです。
見た目はStoryboardで作成したアプリと変わりませんが、中身の実装思想が全く異なります。

環境

  • macOS: Sequoia 15.5
  • Xcode: 16.3
  • Swift: 6.1

主な実装

ここからは、実際にどのように実装したのかを3つのステップに分けて解説します。

ステップ1:データを管理する部品 (Model) を作る

まず、タスクの情報を管理するための「型」を定義します。
今回はタスクの文字列と、それがユニークであることを示すためのIDを持つようにstruct(構造体)で定義しました。

// Todo項目一つ分を表すデータ構造
struct Task: Identifiable {
    let id = UUID() // ユニークなIDを自動で生成
    var title: String
}

ポイントはIdentifiableプロトコルに準拠させることです。
これによって、SwiftUIのListが各項目をユニークに識別できるようになります。

ステップ2:画面を作る (View)

次に、ユーザーが見る画面を作成します。
Listを使ってタスク一覧を表示し、TextFieldで新しいタスクを入力できるようにしました。

struct ContentView: View {
    // 状態を管理する変数は後で追加します
    
    var body: some View {
        NavigationView {
            VStack {
                // タスク入力欄と追加ボタン
                HStack {
                    TextField("新しいタスクを入力", text: .constant(""))
                        .textFieldStyle(RoundedBorderTextFieldStyle())
                    Button(action: {
                        // ボタンが押された時の処理
                    }) {
                        Text("追加")
                    }
                }
                .padding()
                
                // タスク一覧を表示するリスト
                List {
                    // ここにタスクを並べる
                }
            }
            .navigationTitle("Todoリスト")
        }
    }
}

VStackで要素を縦に、HStackで横に並べています。
このようにUI部品を組み合わせるだけで、直感的にレイアウトが組めるのがSwiftUIの面白いところです。

ステップ3:データを画面に反映させる (State)

最後に、ユーザーの操作によってデータが変更され、画面が自動で更新される「状態管理」の仕組みを作ります。
@Stateというプロパティラッパを使うのが基本です。

struct ContentView: View {
    // @Stateを付けることで、この変数が変更されるとUIが自動で更新される
    @State private var tasks = [Task]() // タスクの配列
    @State private var newTaskTitle = "" // 入力中のテキスト
    
    var body: some View {
        NavigationView {
            VStack {
                HStack {
                    TextField("新しいタスクを入力", text: $newTaskTitle) // $を付けてデータをバインディング
                        .textFieldStyle(RoundedBorderTextFieldStyle())
                    Button(action: {
                        // ボタンが押されたら新しいタスクを追加
                        let newTask = Task(title: newTaskTitle)
                        tasks.append(newTask)
                        newTaskTitle = "" // 入力欄をクリア
                    }) {
                        Text("追加")
                    }
                }
                .padding()
                
                List(tasks) { task in
                    Text(task.title)
                }
            }
            .navigationTitle("Todoリスト")
        }
    }
}

@Stateをつけたtasks配列に新しい要素を追加するだけで、Listが自動的に再描画され、画面に新しいタスクが表示されます。
TextFieldのtext:引数に$newTaskTitle$を付けて渡すことで、テキストフィールドへの入力がnewTaskTitle変数にリアルタイムで反映されます。これをデータバインディングと呼びます。

まとめ:学んだ5つのこと

今回の簡単なTodoアプリ開発を通して、SwiftUIの基本的な考え方を学ぶことができました。

  • 1.宣言的なUI
    • 画面に「何があるべきか」をコードで書くだけでUIが作れる。
  • 2.@Stateによる状態管理
    • @Stateを付けるだけで、データの変更が自動でUIに反映される。
  • 3.データバインディング
    • $を使うと、UI(TextField)とデータ(@State変数)を簡単につなげられる。
  • 4.Identifiableの重要性
    • Listなどで動的にデータを扱う際には、各要素をユニークに識別する仕組みが不可欠。
  • 5.まずは小さく作る
    • 最初から完璧を目指さず、まずは「追加」機能だけ作ることで、一つ一つの仕組みを集中して学べました。

ご紹介したように、SwiftUIを使えば、少ないコードでiOSアプリを形にすることができます!
特に、コードを書くとリアルタイムで画面が変化するため、開発が非常にスムーズに進むと実感しました。これまでiOSアプリ開発にハードルを感じていた方も、SwiftUIの直感的な開発スタイルなら、楽しみながら挑戦できるはずです。少しでも参考になれば幸いです!


株式会社ウイングドアは福岡のシステム開発会社です。
現在、私達と一緒に"楽しく仕事が出来る仲間"として、新卒・中途採用を絶賛募集しています!
ウイングドアの仲間達となら楽しく仕事できるかも?と興味をもった方、
お気軽にお問い合わせ下さい!

アーカイブ