本文へスキップ
BecomeCoder

Swift(iOSアプリ)コース · 第7章 リストと画面遷移 ― 実アプリの形 · レッスン29

ForEach ― データの数だけ行を作る

ブラウザで完結

導入

一覧の行を1つずつ手書きするのは非現実的。データの配列から 数だけ自動で 行を作るのが ForEach です。

説明

ForEach(配列, id: \.self) { 要素 in ... } で、配列の要素ごとに行を生成します。

struct ContentView: View {
    let fruits = ["りんご", "みかん", "ぶどう", "いちご", "もも"]

    var body: some View {
        List {
            ForEach(fruits, id: \.self) { fruit in
                Label(fruit, systemImage: "leaf.fill")
            }
        }
    }
}

fruit infruit が、各回の要素。fruits に果物を足すと、行も自動で増えます。データと画面が連動するのがSwiftUIの本質です。

実際のアプリでは、行のデータは struct のモデルで表します。そのとき「どの行か」を見分けるために Identifiable(第4章のprotocol)に準拠させ、id を持たせます。

struct Fruit: Identifiable {
    let id = UUID()      // 一意なID
    let name: String
}
// ForEach(fruits) { fruit in Text(fruit.name) }  ← id 指定が不要になる

Identifiable にしておくと ForEach(fruits) だけで書け(id: を省ける)、行の追加・削除・並べ替えも正しく扱えます。

やってみよう

fruits 配列に要素を足したり減らしたりして、リストの行数が自動で変わるのを確かめましょう。systemImage を変えてアイコンも変えてみてください。

演習

fruits を自分の好きなもの5つの配列に置き換えて、5行のリストを表示してください。

ヒント1を見る

let fruits = ["A", "B", "C", "D", "E"] の中身を変えます。

ヒント2を見る

ForEach はそのままで、行数が配列に追従します。

実際に動かしてみよう

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

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

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