1. ホーム
  2. swift

[解決済み] SwiftUIのForEachでインデックスを取得する

2022-10-20 11:54:51

質問

配列があり、それを繰り返し処理したいのですが、配列の値に基づいてビューを初期化し、配列のアイテムのインデックスに基づいてアクションを実行したいです。

オブジェクトを繰り返し処理する場合

ForEach(array, id: \.self) { item in
  CustomView(item: item)
    .tapAction {
      self.doSomething(index) // Can't get index, so this won't work
    }
}

そこで、別の方法を試してみました

ForEach((0..<array.count)) { index in
  CustomView(item: array[index])
    .tapAction {
      self.doSomething(index)
    }
}

しかし、2番目の方法の問題点は、配列を変更したときに、たとえば doSomething は次のようになります。

self.array = [1,2,3]

のビューを ForEach のビューは、値が変更されても変更されません。私が思うに、この現象は array.count が変化していないからだと思います。

これに対する解決策はあるのでしょうか?よろしくお願いします。

どのように解決するのですか?

これは私のために動作します。

範囲とカウントの使用

struct ContentView: View {
    @State private var array = [1, 1, 2]

    func doSomething(index: Int) {
        self.array = [1, 2, 3]
    }
    
    var body: some View {
        ForEach(0..<array.count) { i in
          Text("\(self.array[i])")
            .onTapGesture { self.doSomething(index: i) }
        }
    }
}

配列の添字を利用する

配列の indices プロパティは数値の範囲です。

struct ContentView: View {
    @State private var array = [1, 1, 2]

    func doSomething(index: Int) {
        self.array = [1, 2, 3]
    }
    
    var body: some View {
        ForEach(array.indices) { i in
          Text("\(self.array[i])")
            .onTapGesture { self.doSomething(index: i) }
        }
    }
}