问题描述
我正在尝试在类型为 :View 的结构内的 If 语句中设置 @State var 的值,如下所示:
struct Name: View {
@State someVar: Int = 0
var body: some View {
vstack {
if this > that {
someVar = 1
但是当我这样做时,我收到错误消息:“类型‘()’不能符合‘视图’;只有结构/枚举/类类型才能符合协议”。如果我使用一个满足我需要的类方法,就像这样:
if this > that {
someClass.doIt()
}
我遇到了同样的错误。
这样做的正确方法是什么?
解决方法
你不能把这样的逻辑代码放在你的 body
中——你能拥有的只有输出视图的代码。
所以,你可以这样做:
var body: some View {
if this > that {
Text("This")
} else {
Text("That")
}
}
因为这会导致渲染视图 (Text
)。但是,在您的示例中,您只是在做作业。
这必须在单独的函数中或在视图中直接呈现的内容之外的闭包中完成。
所以:
func testThisThat() {
if this > that {
someVar = 1
}
}
var body: some View {
Button(action: {
testThisThat()
}) {
Text("Run test")
}
}
在上面,您的逻辑在视图层次结构之外的闭包中运行,并且 Button
被渲染到视图中。
如果您提供更多有关您要执行的操作的详细信息,也许可以澄清答案,但这就是错误的根源。
正如评论中所建议的,您还可以在 onAppear
中运行逻辑代码,如下所示:
var body: some View {
VStack {
//view code
}.onAppear {
//logic
if this > that {
someVar = 1
}
}
}