ForEachでループする場合Identifiableのstructを使う方法とid: .selfがあります。
これをしないとui上でどれがどれかプログラム上判断がつかなくなるので仕様として必要になります。
struct Hoge: Identifiable {
let id: UUID
var name: String
}
struct Test: View {
var hoges = [Hoge]()
var body: some View {
VStack {
ForEach(hoges) { hoge in
Text(text: hoge.name)
}
}
}
}
Identifiableをつけるのがルールであるが、プリミティブな型の場合はできないため、id: .selfが必要になります。
struct Test: View {
var names: [String]
var body: some View {
VStack {
ForEach(names, id: \.self) { name in
// do something
}
}
}
}
めんどくさいですよね。extensionで整理
extension ForEach where Data.Element: Hashable, ID == Data.Element, Content: View {
init(values: Data, content: @escaping (Data.Element) -> Content) {
self.init(values, id: \.self, content: content)
}
}
これでこうなります
struct Test: View {
var names: [String]
var body: some View {
VStack {
ForEach(values: names) { name in
// do something
}
}
}
}
これで良いね