我List
使用一个Codable
名为Package
. 在某些时候,当用户点击列表中的按钮时,我需要更新项目的isFavorite
值。但是我得到了. 首先,我尝试直接更改操作中的值。它没有用,所以到目前为止我得到的要点如下。Package
favorite
Cannot use mutating member on immutable value: 'package' is a 'let' constant
显然代码比这更长,但我只是想让它变得简单并删除不相关的部分。
SwiftUIView
struct AView: View {
@ObservedObject var store: JSONController
var body: some View {
NavigationView {
List(self.store.packages) { (package) in
return self.row(package)
}
}
}
private func row(_ package: Package) -> some View {
HStack{
Text(package.name)
Spacer()
Button(action: {
package.changeFavoriteState()
}) {
Image(systemName: package.isFavorite ? "star.fill" : "star")
}.buttonStyle(PlainButtonStyle())
}
}
}
Package.struct
struct Package: Codable, Identifiable {
var id: UUID
var isFavorite: Bool
mutating func changeFavoriteState() {
self.isFavorite.toggle()
}
}
PackageList.struct
struct PackageList: Codable {
var packages: [Package]
private enum CodingKeys: CodingKey {
case packages
}
init(){
self.packages = [Package]()
}
init(from decoder: Decoder) throws {
do {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.packages = try container.decode([Package].self, forKey: .packages)
}catch let error {
print(error.localizedDescription+" Initializing packages with an empty array.")
self.packages = [Package]()
}
}
}
JSONController.class
class JSONController: ObservableObject {
@Published var packages: [Package] = [Package]()
init(){
self.readJSONFile(from: "packageList")
}
func readJSONFile(from url: String) {
//stuff
}
}
最后我得到的错误,