在 BehaviourRelay 中更新嵌套 属性 的最佳方式
Best way to update nested property in BehaviourRelay
我有以下型号
final class Vehicle {
var cars:[SportsCar] = []
}
final class SportsCar {
var isCheap:Bool = false
}
假设 Vehicle 和 SportsCar 都是 Equatable(为简单起见,我省略了 Equatable 一致性)。
目标: 更新 isCheap 属性 嵌套在 Vehicles BehaviorRelay 继电器内的汽车数组中的其中一辆汽车。
尝试次数:
final class ViewModel {
let vehicles:BehaviorRelay<[Vehicle]> = BehaviorRelay(value: [])
// Attempt 1: Access vehicles direct without making a copy.
// Toggling `isCheap` property when user tap a button on a collectionView cell.
func updateCarProperty(checkedVehicle:Vehicle,checkedIndexPath:IndexPath){
for car in vehicles.value[checkedIndexPath.section].cars {
let checkedCar = checkedVehicle.cars[checkedIndexPath.item]
if car == checkedCar {
if car.isCheap {
vehicles.value[checkedIndexPath.section].cars[checkedIndexPath.item].isCheap = false
}else {
vehicles.value[checkedIndexPath.section].districts[checkedIndexPath.item].isCheap = true
}
break
}
}
}
}
// Attempt 2: Make a copy of vehicles then use it to change the property then on completion update the whole vehicles array by calling
//vehicles.accept(vehiclesCopy)
// As described on this answer:
// This approach didn't work too.
期望: 汽车很便宜 属性 在函数调用完成后更改。
结果: 属性 没有按预期更改。无论如何它都保持默认值(false)!!
问题:有没有其他更好的方法来处理这个问题?
您必须创建对象的全新副本并将其发送到中继。您不能发出“子集”或中继类型,因为它发出 [Vehicle]
类型的值,所以您必须始终向它发送一个新的车辆数组。
您必须创建车辆数组的副本,改变所需的项目,然后使用 .accept(updatedVehicles)
.
将整个数组发回
我有以下型号
final class Vehicle {
var cars:[SportsCar] = []
}
final class SportsCar {
var isCheap:Bool = false
}
假设 Vehicle 和 SportsCar 都是 Equatable(为简单起见,我省略了 Equatable 一致性)。
目标: 更新 isCheap 属性 嵌套在 Vehicles BehaviorRelay 继电器内的汽车数组中的其中一辆汽车。
尝试次数:
final class ViewModel {
let vehicles:BehaviorRelay<[Vehicle]> = BehaviorRelay(value: [])
// Attempt 1: Access vehicles direct without making a copy.
// Toggling `isCheap` property when user tap a button on a collectionView cell.
func updateCarProperty(checkedVehicle:Vehicle,checkedIndexPath:IndexPath){
for car in vehicles.value[checkedIndexPath.section].cars {
let checkedCar = checkedVehicle.cars[checkedIndexPath.item]
if car == checkedCar {
if car.isCheap {
vehicles.value[checkedIndexPath.section].cars[checkedIndexPath.item].isCheap = false
}else {
vehicles.value[checkedIndexPath.section].districts[checkedIndexPath.item].isCheap = true
}
break
}
}
}
}
// Attempt 2: Make a copy of vehicles then use it to change the property then on completion update the whole vehicles array by calling
//vehicles.accept(vehiclesCopy)
// As described on this answer:
// This approach didn't work too.
期望: 汽车很便宜 属性 在函数调用完成后更改。
结果: 属性 没有按预期更改。无论如何它都保持默认值(false)!!
问题:有没有其他更好的方法来处理这个问题?
您必须创建对象的全新副本并将其发送到中继。您不能发出“子集”或中继类型,因为它发出 [Vehicle]
类型的值,所以您必须始终向它发送一个新的车辆数组。
您必须创建车辆数组的副本,改变所需的项目,然后使用 .accept(updatedVehicles)
.