gpt4 book ai didi

swift (用户界面)错误 : Cannot use mutating member on immutable value: 'self' is immutable

转载 作者:行者123 更新时间:2023-12-01 21:28:51 26 4
gpt4 key购买 nike

基本上我想要做的是,如果您按下按钮,那么条目应该获得一个新的 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
}
}

最佳答案

View 在 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()
}
}
}
}

关于 swift (用户界面)错误 : Cannot use mutating member on immutable value: 'self' is immutable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62699772/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com