自定义对象的 属性 更改时的状态

State when a property of a custom object changes

我有一个这样的对象(简化):

struct BoxModel: Codable, Identifiable, Hashable {
    var id: Int
    var number: Int
}

我有一个二维数组:

@State private var matrix = generate()

其中 generate 创建对象的二维数组:[[BoxModel]]。然后我将它们显示在网格中。网格非常复杂,但这里有一个非常简化的形式:

LazyVGrid(columns: columns, spacing: 0 ) {
    ForEach(1...9, id: \.self) { j in
         Text("\(getModel(j).number)")
    }
}

其中 getValue 从数组中获取对应于网格位置的项目。由于网格很复杂,我需要在一个单独的函数中做一些算术运算。

下面是一个按钮。当用户点击它时,它会更改数组中对象之一的编号 属性。但是,数字不会更新。我认为它会因为数组是 @State 属性.

有没有办法让它更新?

这是 ContentView 的一个极其简化的形式:

struct ContentView: View {

@State private var matrix = generate()


var body: some View {
    NavigationView {
        GeometryReader { geometry in
            ScrollView {
                VStack {

                    let columns = [GridItem(.fixed(50), spacing: 0),
                                     GridItem(.fixed(50), spacing: 0),
                                     GridItem(.fixed(50), spacing: 0)]
                    

                    LazyVGrid(columns: columns, spacing: 0 ) {
                        ForEach(1...9, id: \.self) { j in
                            Text("\(getModel(j).number)")
                        }
                    }
                    .padding()
                    Button {
                        var model = getModel(0)
                        model.number = 5
                    } label: {
                        Text("Click Me")
                    }
                }
            }
        }
    }
}


func getModel(_ i: Int) -> BoxModel {
    // very simplified
    return matrix[0][i]
}

总而言之,Button 闭包中的代码正在创建一个与 matrix 变量 different/not 相关的新对象。因此更新新对象不会影响 @State 变量。

更改 Button 操作闭包中的代码,来自:

var model = getModel(0)
model.number = 5

if let index = matrix[0].firstIndex(of: getModel(1)) {
    matrix[0][index].number = 5
}

我们的目标是确保您 updating/changing @State 属性 本身。