🏗️

SwiftUIのstruct配列の値の更新

2022/07/02に公開

概要

  • 下記のようなstruct配列のデータを更新することを考える。

image

参考

【SwiftUI】List の使い方【総まとめ】

実装

Property Wrapper

  • 値型のstructの配列は@Stateを使えば良い
@State var users = [User(name: "taro"), User(name: "jiro"), User(name: "saburo")]

配列要素の値の更新

  • 値を更新する場合、下記のようにindicesを経由する必要がある。
  • for user in usersとするとエラーとなる。
    • これはfor user in usersuserusersの要素をコピーしたものであるからで、そもそも更新したい対象を指しておらずまた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