本文へスキップ
BecomeCoder

Swift(iOSアプリ)コース · 第6章 状態管理 ― アプリを動かす · レッスン24

@State と再描画 ― カウンターを作る

ブラウザで完結

導入

「ボタンを押すたびに数が増える」。この当たり前の動きを支えるのが @State です。SwiftUIでは、状態が変わると画面が 自動で描き直され ます。

説明

画面が持つ「変わる値」には @State を付けます。その値を変えると、SwiftUIが関係する部分を自動で更新します。

struct ContentView: View {
    @State private var count = 0

    var body: some View {
        VStack(spacing: 24) {
            Text("カウント: \(count)")
                .font(.largeTitle)
                .fontWeight(.bold)
            HStack(spacing: 16) {
                Button("-1") {
                    count -= 1
                }
                Button("+1") {
                    count += 1
                }
                .buttonStyle(.borderedProminent)
            }
        }
        .padding()
    }
}

ポイントはこの流れです。

graph LR
  A["ボタンをタップ"] --> B["count を +1"]
  B --> C["@State が変化を検知"]
  C --> D["body を再計算<br/>(自動で再描画)"]
  D --> E["画面のカウントが更新"]

自分で「画面を更新して」と命令する必要はありません。状態を変えれば、画面は勝手に追いつく。これがSwiftUIの考え方です。private は「この画面の中だけで使う」という印で、@State では定番の書き方です。

やってみよう

プレビューの「+1」「-1」ボタンを押して、数が変わるのを確かめましょう。初期値 count = 0 を別の数にすると、最初の表示が変わります。

演習

「+1」ボタンを押すと count10ずつ 増えるように変えてください。

ヒント1を見る

count += 1count += 10 にします。

ヒント2を見る

プレビューのボタンで10ずつ増えれば成功です。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

Swift / SwiftUI — ブラウザ内で実行(学習用)

Swiftの教材サブセットを動かす学習用ランナーを読み込みます。ふつうのコードは print の出力を表示し、SwiftUI(struct: View)を書くと右にiPhone風のライブプレビューを描画します(本物のXcode/Swiftコンパイラではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。