当用户点击列表中与某个项目关联的对象时,我想更改与该项目关联的对象的值,并且我收到下一个错误"无法分配给属性:"学生"是一个"let'常量"。如何防止这种情况发生?
这是我的代码:
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()
}
}
正如注释中@koen提到的,您应该使用@State
或@EnvironmentObject
来访问/改变 SwiftUI 视图中的变量和状态。
与 UIKit 不同,您可能会注意到 SwiftUI 如何依赖于结构体的大量使用。默认情况下,结构是不可变的,这意味着如果不明确告诉编译器结构是可变的(使用var
关键字等),就无法修改结构的任何部分。在 SwiftUI 中管理状态的方法是使用Combine
框架和使用@State
属性等。从您的代码的简要看来看,您需要做的就是将@State var student: Student
添加到您的StudentItemListView
中。
如果这听起来令人困惑,或者你不知道@State
可能是什么,我强烈建议你观看2019年的WWDC视频,看看苹果提供的SwiftUI教程。