ForEachは繰り返し処理の中で、Viewを生成する仕組みです。
名前の配列をループしてそれぞれをTextView化する、あるいはメニュー項目に追加するなどの動きを実現します。
加えて、ForEachを使うとViewを手動で追加した場合に発生する10個までの制限も受けません。
ForEachの繰り返しの対象については、次の2通りの指定方法があります。
- 繰り返す範囲を数値(Int)で指定する方法【範囲指定】
- 各要素の一意性を保証したデータコレクションとして渡す方法【id指定】
本記事(1/2)では、1番目の方法について解説します。
2番目の方法については、こちらの記事を参照して下さい。

環境
この記事の情報は次のバージョンで動作確認しています。
【Swift】5.1
【iOS】13.2.2
【macOS】Catalina バージョン 10.15.2
基本的な使い方
1 2 3 4 5 6 7 8 9 10 11 |
struct ContentView: View { var body: some View { Form { ForEach(1..<6) { num in Text("\(num)行目") } } } } |
ForEachは複数のViewを生成しますので、FormやList、VStackなどのコンテナ内に記述するのが前提となります。また、Pickerの選択肢設定などにも使えます。
引数にはSwiftの範囲型(Range)で繰り返す範囲を指定します。上記の”1..<6”は1以上6未満(つまり1〜5)の範囲を指定しています。
ForEachは、繰り返すすべてのアイテム(この例では数値)に対して、{}で示すクロージャーを1回実行し、引数として現在のループアイテムを渡します。
引数名の指定は"引数名 in"と記述します。
1から5までループする場合は、1,2,3・・のように渡されます。
ForEachのイニシャライザの定義で指定されている引数の型がRange<Int>の為、同じ範囲指定でも、ClosedRange(”1...5”のような記述)はこの場合使えないので注意して下さい。コンパイルエラーになります。
配列(コレクション)での繰り返し処理
範囲型(Range)で繰り返す範囲を指定する方法を応用して、配列(コレクション)を使った繰り返し処理ができます。
1 2 3 4 5 6 7 8 9 10 11 12 |
struct ContentView: View { let animals = ["カピバラ", "アルパカ", "トナカイ", "アルマジロ"] var body: some View { Form { ForEach(0..<animals.count) { num in Text(self.animals[num]) } } } } |
但しこの方式が使えるのは、データの変更(削除・並び替え)が発生しない出力専用として使う場合のみです。(Pickerのリスト指定など)
データの変更が発生する場合は、各要素の一意性を保証する必要がある為、次の記事(2/2)で解説する、id指定方式で出力します。

あわせて読みたい記事


