🏗️
SwiftUIのstruct配列の値の更新
概要
- 下記のようなstruct配列のデータを更新することを考える。
参考
実装
Property Wrapper
- 値型のstructの配列は
@State
を使えば良い
@State var users = [User(name: "taro"), User(name: "jiro"), User(name: "saburo")]
配列要素の値の更新
- 値を更新する場合、下記のように
indices
を経由する必要がある。 -
for user in users
とするとエラーとなる。- これは
for user in users
のuser
はusers
の要素をコピーしたものであるからで、そもそも更新したい対象を指しておらずまたlet
であるため変更できない。
- これは
Button("Increment count") {
for index in users.indices {
users[index].count += 1
}
}
// 下記エラーとなる
// Left side of mutating operator isn't mutable: 'user' is a 'let' constant
Button("Increment count") {
for user in users {
user.count += 1
}
}
コード全体
import SwiftUI
struct User {
var id: String = UUID().uuidString
var name: String
var count: Int = Int.random(in: 1...10)
}
struct ContentView: View {
@State var users = [User(name: "taro"), User(name: "jiro"), User(name: "saburo")]
var body: some View {
List {
Button("Increment count") {
for index in users.indices {
users[index].count += 1
}
}
ForEach(users, id: \.id) { user in
HStack {
Text(user.name)
Spacer()
Text("\(user.count)")
}
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
Discussion