我正在使用大型复杂模型构建自定义View结构,该模型要从var body : some View { ... }
属性中进行更新(例如,点击表示视图中表列的按钮应更改的排序顺序)表中的行)。我不允许在body
内修改此模型,因为self
是不可变的:
struct MyTable : View {
struct Configuration {
// a LOT of data here, ie header, rows, footer, style, etc
mutating func update() { ... } // this method must be called before view render
}
var configuration : Configuration
var body : some View {
// build the view here based on configuration
self.configuration.columns[3].sortAscending = false // error, `self` is immutable
self.configuration.update() // error, `self` is immutable
}
}
我真的不想为所有配置数据创建@State变量,因为1)有很多配置数据,2)以这种方式对模型建模很困难。
我尝试将configuration
设置为@State变量,但是即使代码可以编译并运行,我也无法在init()
时设置配置对象! (顺便说一句,configuration
var现在需要在初始化之前进行初始化,否则我会在self.configuration = c
行上得到一个错误,指出在初始化所有成员之前使用了self
–这很可能是使用@State(这是属性包装器)带来的麻烦。)
struct MyTable : View {
struct Configuration {
...
}
@State var configuration : Configuration = Configuration() // must initialize the @State var
init(configuration c: Configuration) {
self.configuration = c // does not assign `c` to `configuration` !!!
self.$configuration.wrappedValue = c // this also does not assign !!!
self.configuration.update()
}
var body : some View {
// build the view here based on configuration
self.configuration.columns[3].sortAscending = false // ok, no error now about mutating a @State var
self.configuration.update() // ok, no error
}
}
答案 0 :(得分:0)
通过在update()
中创建自定义MyTable.init()
并调用{{1 }}。这样,init()
中的Configuration
是不必要的,这种方法可以解决以前遇到的所有问题:
update()
然后在我的呼叫代码中:
init()