「SwiftUI」 ForEachでidを設定しつつindexを取得する方法

ForEachで同じViewを繰り返そうとした時に回した回数(index)を知りたかったケースがあったので、メモとして残しておきます。

先にサンプルのコードを記載しておきます。

struct TestView: View {
    var languages = ["Swift", "Ruby", "Python"]
    var body: some View {
        VStack {
            ForEach(Array(languages.enumerated()), id: \.offset) { index, language in
                Text("index \(index) : language \(language)")
            }
        }
    }
}

ForEach文のindexにインデックス番号、languageにインデックス番号に対応する要素が入ります。 「id: \.offset」はデータを一意に識別するためのキーとしてインデックス番号を指定しています。 インデックス番号でなく、要素(ここではlanguage)をキーとしたい場合は、id: \.elementとしてください。

ちなみにですが、enumerated()が何をしているのかというと、こんな感じです。

var languages = ["Swift", "Ruby", "Python"]
for (index, language) in languages.enumerated() {
    print("\(index): '\(language)'")
}

// 出力結果
0: 'Swift'
1: 'Ruby'
2: 'Python'

公式ドキュメントはこちらです。 developer.apple.com