【问题标题】:Set a @State var inside an If statement in Swift在 Swift 的 If 语句中设置 @State var
【发布时间】:2021-05-12 11:30:07
【问题描述】:

我正在尝试在类型为 :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()
    }

我得到同样的错误。

这样做的正确方法是什么?

【问题讨论】:

  • 这是一个 SwiftUI 问题,而不是 Swift。我添加了 SwiftUI 标签。

标签: swift swiftui closures viewbuilder


【解决方案1】:

您不能在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 被渲染到视图。

如果你提供更多关于你想要做什么的细节,也许答案可以澄清,但这就是错误的根源。

按照 cmets 的建议,您也可以在 onAppear 中运行逻辑代码,如下所示:

var body: some View {
  VStack {
   //view code
  }.onAppear {
   //logic
    if this > that {
      someVar = 1
    } 
  }
}

【讨论】:

  • 我认为 OP 不想运行一个动作来执行一些代码!所有 OP 都想检查一些逻辑然后执行一些操作,我认为在这种情况下 onAppear 或 onChange 会是更好的选择。
  • 好点——更新答案以反映这一点。
  • 感谢您的澄清。将逻辑放入 .onAppear 解决了我的问题。通过将其标记到 VStack 上,我可以确定比较的结果,然后将其传递给按下以关闭工作表的“完成”按钮。然后我可以在离开视图之前进行一些更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 2020-05-06
  • 1970-01-01
  • 1970-01-01
  • 2015-08-18
  • 2021-07-29
  • 2017-03-10
相关资源
最近更新 更多