1

当用户点击该项目时,我想更改与列表中的项目关联的对象的值,并且我收到下一个错误“无法分配给属性:'学生'是'让'常量”。我该如何防止这种情况发生?

这是我的代码:

import SwiftUI

var students: [Student] = load("studentsData.json")

struct StudentsListView: View {
    @EnvironmentObject var viewRouter:ViewRouter

    var body: some View {
        NavigationView{
            List(students){student in
                Button(action: {
                    student.isInClass = true
                }){
                    StudentItemListView(student: student)
                }
            }
        }
    }
}

struct StudentsListView_Previews: PreviewProvider {
    static var previews: some View {
        StudentsListView().environmentObject(ViewRouter())
    }
}

struct StudentItemListView: View {
    var student:Student

    var body: some View {
        HStack {
            Image("profile")
                .resizable()
                .aspectRatio(contentMode: .fill)
                .frame(width:50, height:50)
                .clipShape(Circle())
            VStack(alignment: .leading){
                Text(student.firstName + " " + student.lastName)
                    .font(.headline)
                if(student.isInClass == true){
                    Text("Asistió")
                    .font(.subheadline)
                    .foregroundColor(.green)
                } else {
                    Text("Faltó")
                    .font(.subheadline)
                    .foregroundColor(.red)
                }
            }
            Spacer()
        }.padding()
    }
}
4

1 回答 1

1

正如评论中提到的@koen,您应该在 SwiftUI 视图中使用@Stateor来访问/改变变量和状态。@EnvironmentObject

与 UIKit 不同,您可能会注意到 SwiftUI 如何依赖于大量使用结构。默认情况下,结构是不可变的,这意味着您不能在没有明确告诉编译器结构是可变的(使用var关键字等)的情况下修改结构的任何部分。在 SwiftUI 中管理状态的方法是使用Combine框架和使用@State属性等。简单地看一下你的代码,看起来你需要做的就是添加@State var student: Student到你的StudentItemListView.

如果这听起来令人困惑或者您不知道@State可能是什么,我强烈建议您观看2019 WWDC 视频并查看 Apple 提供的SwiftUI 教程

于 2019-11-20T19:41:25.753 回答