У вашей проблемы есть два решения: первое будет с struct
, а второе с Class
.
Использование Struct
Класс модели:
struct Light: Identifiable {
var id: Int
var deviceName: String
var intensity: Int
// State are used with View
var mode: Bool
}
, и ваш View View будет выглядеть ниже, так как это массив struct, поэтому вам нужно получить к нему доступ по индексу и изменить его значение
var body: some View {
VStack {
ForEach(lightStore.allLights.indices) { index in
HStack {
Text("\(self.lightStore.allLights[index].id)")
Text("\(self.lightStore.allLights[index].deviceName)")
Text("- \(self.lightStore.allLights[index].intensity)")
Text("- " + String(self.lightStore.allLights[index].mode))
Toggle(isOn: Binding(get: {
return self.lightStore.allLights[index].mode
}) { (value) in
//self.objectWillChange.send()
self.lightStore.allLights[index].mode = value
}) {
Text(self.lightStore.allLights[index].mode ? "Switch off" : "Switch on")
}
}
}
}
}
Используя Class
Модель класса:
class Light: Identifiable, ObservableObject {
var id: Int
var deviceName: String
var intensity: Int
var mode: Bool
init(id: Int, deviceName: String, intensity: Int, mode: Bool) {
self.id = id
self.deviceName = deviceName
self.intensity = intensity
self.mode = mode
}
}
и ваш класс просмотра будет как ниже
var body: some View {
VStack {
ForEach(lightStore.allLights) { light in
HStack {
Text("\(light.id)")
Text("\(light.deviceName)")
Text("- \(light.intensity)")
Text("- " + String(light.mode))
Toggle(isOn: Binding(get: {
return light.mode
}) { (value) in
self.lightStore.objectWillChange.send() // you have to manually tell lightStore object to update
light.mode = value
}) {
Text(light.mode ? "Switch off" : "Switch on")
}
}
}
}
}