回答編集履歴

1

idを記述する理由について追記しました。

2022/09/16 11:27

投稿

退会済みユーザー
test CHANGED
@@ -10,3 +10,72 @@
10
10
  }
11
11
  ```
12
12
 
13
+
14
+ ### 追記です。
15
+
16
+ コメントありがとうございます。
17
+
18
+ > これはなぜか説明していただければ幸いです。
19
+
20
+
21
+ > Creates an instance that uniquely identifies and creates views across updates based on the provided key path to the underlying data’s identifier.
22
+ > (機械翻訳)基礎となるデータの識別子への提供されたキーパスに基づいて、更新にわたってビューを一意に識別して作成するインスタンスを作成します。
23
+ >
24
+ > https://developer.apple.com/documentation/swiftui/foreach/init(_:id:content:)-82hm4
25
+
26
+
27
+ SwiftUIの内部実装まで把握していないので合っているかわからないですが・・
28
+ リストを動的に追加したり、削除したりするのに、SwiftUIが要素を一意に識別できるようにしてあげる必要があるみたいです。
29
+ そのための情報がidみたいです。
30
+
31
+ 例えば、下のサンプルコードはidが一意ではないので、
32
+ ([1, 2, 1, 2, 1]なので1が3つあるし、2が2つある)
33
+ 4番目の要素をスワイプして削除すると、
34
+ 2番目の2と3番目の1が入れ替わって?
35
+ [1, 1, 2, 1]
36
+ の順番で表示されます。
37
+
38
+ 要素を一意に識別できないとこのような不都合があるので、
39
+ SwiftUIに要素を一意に識別できるための情報(id)を渡してあげる必要があるみたいです。
40
+
41
+ *idを渡さないとSwiftUIは何も識別できないことになると思います
42
+ *selfは要素自身ですので、サンプルコードの場合ですと、「1」とか「2」とかの値になります
43
+
44
+ ```swift
45
+ import SwiftUI
46
+
47
+ struct ContentView: View {
48
+ @State var array: [Int] = [1, 2, 1, 2, 1]
49
+ var body: some View {
50
+ List {
51
+ ForEach(array, id: \.self) { int in
52
+ Text("\(int)")
53
+ }
54
+ .onDelete(perform: perform)
55
+ }
56
+ }
57
+ func perform(ind: IndexSet) {
58
+ array.remove(atOffsets: ind)
59
+ print(array)
60
+ }
61
+ }
62
+ ```
63
+
64
+ ---
65
+ > It’s important that the id of a data element doesn’t change, unless SwiftUI considers the data element to have been replaced with a new data element that has a new identity. If the id of a data element changes, then the content view generated from that data element will lose any current state and animations.
66
+ > (機械翻訳)SwiftUI がデータ要素を新しい ID を持つ新しいデータ要素に置き換えたと考えない限り、データ要素の ID が変更されないことは重要です。データ要素のIDが変更された場合、そのデータ要素から生成されたコンテンツビューは、現在の状態とアニメーションを失います。
67
+ >
68
+ > https://developer.apple.com/documentation/swiftui/foreach/init(_:id:content:)-82hm4
69
+
70
+ 機械翻訳で表現は微妙ですし、
71
+ 今回とはちょっと異なるケースかもしれませんが、
72
+ 「現在の状態とアニメーションを失います。」
73
+ と記載されています。
74
+ idを渡してあげないと内部の配列に対して要素を追加・削除しても、画面にその内容が反映されないということだと思います。
75
+
76
+ ---
77
+
78
+ SwiftUIのチュートリアルも実践してみるとより理解が深まると思うのですが、
79
+ idをForEachに直接記述する以外にも、データにidプロパティを持たせることもできるみたいです。
80
+ https://developer.apple.com/tutorials/swiftui/building-lists-and-navigation
81
+