提问人:blksld 提问时间:7/2/2020 更新时间:7/3/2020 访问量:4872
Swift(UI) 错误:无法对不可变值使用变异成员:“self”是不可变的
Swift(UI) Error: Cannot use mutating member on immutable value: 'self' is immutable
问:
基本上我想做的是,如果你按下按钮,那么条目应该得到一个新的CEntry。如果有人能帮助我,那就太好了。谢谢!
struct AView: View {
var entries = [CEntries]()
var body: some View {
ZStack {
VStack {
Text("Hello")
ScrollView{
ForEach(entries) { entry in
VStack{
Text(entry.string1)
Text(entry.string2)
}
}
}
}
Button(action: {
self.entries.append(CEntries(string1: "he", string2: "lp")) <-- Error
}) {
someButtonStyle()
}
}
}
}
班级 CEntries
class CEntries: ObservableObject, Identifiable{
@Published var string1 = ""
@Published var string2 = ""
init(string1: String, string2: String) {
self.string1 = string1
self.string2 = string2
}
}
答:
7赞
New Dev
7/3/2020
#1
视图在 SwiftUI 中是不可变的。您只能通过更改具有属性包装器的属性来更改其状态:@State
@State var entries: [CEntries] = []
但是,虽然您可以这样做,但在您的例子中是一个类(即引用类型),因此,虽然您可以检测元素的添加和删除数组中的更改,但您将无法检测到元素本身的变化,例如,当属性更新时。CEntries
entries
.string1
而且它是一个 .ObservableObject
相反,更改为 - 值类型,这样如果它更改,值本身也会更改:CEntries
struct
struct CEntries: Identifiable {
var id: UUID = .init()
var string1 = ""
var string2 = ""
}
struct AView: View {
@State var entries = [CEntries]()
var body: some View {
VStack() {
ForEach(entries) { entry in
VStack {
Text(entry.string1)
Text(entry.string2)
}
}
Button(action: {
self.entries.append(CEntries(string1: "he", string2: "lp"))
}) {
someButtonStyle()
}
}
}
}
评论
0赞
blksld
7/4/2020
感谢您的快速回答。
评论