【发布时间】:2021-10-17 12:28:52
【问题描述】:
我遇到了一些问题并写了一些基本的变体来显示问题:
import SwiftUI
struct PersonStruct {
// Requires @State because self.name is immutable otherwise
@State var name:String
init (_ name: String) { self.name = name }
func changeName(_ name: String) {
self.name = name
print (self.name)
}
}
class PersonClass {
var name:String
init (_ name: String) { self.name = name }
func changeName(_ name: String) {
self.name = name
print (self.name)
}
}
struct ContentView: View {
var person1:PersonStruct = PersonStruct("Peter S.")
var person2:PersonClass = PersonClass("Peter C.")
var body: some View {
VStack {
Text(person1.name)
.padding()
Text(person2.name)
.padding()
Button("Change name") {
person1.changeName("Trevor")
person1.name = "Trevor"
person2.changeName("Trevor")
person2.name = "Trevor"
print("---")
print (person1.name)
print (person2.name)
}
.padding()
}
.font(.title)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
person 变量的行为不同,按下按钮将 person2 的名称从“Peter C”更改为 Trever - 如控制台中的“print”所示。 但是 person1 的名字不会改变,它保持在“Peter S”。 ...
因此,该结构似乎根本不起作用。
在这两种情况下,视图中的文本输出都不会改变 - “Peter C”和“Peter S”保持可见。
为什么 person1 的内容没有改变? 我什至使用了函数“changeName()”,还尝试直接设置名称。 无济于事:-(
【问题讨论】:
-
您不应在非 SwiftUI 结构中使用
@State,即不符合View的结构。另一方面,您应该将@State用于ContentView中的两个属性。如果您仍有问题,请修复并返回 -
删除结构中的@State 给出了“无法分配给属性:'self' 是不可变的”,如上所述。但是 vadian 的“变异”确实解决了这个问题!
标签: swift class struct swiftui