Установите @State var внутри оператора If в Swift

Я пытаюсь установить значение @State var в операторе If, который находится внутри структуры типа:View, например:

      struct Name: View {
  @State someVar: Int = 0
    var body: some View {
      VStack {
        if this > that {
          someVar = 1

Но когда я делаю это, я получаю сообщение об ошибке: «Тип '()' не может соответствовать« Представлению »; только типы структур / перечислений / классов могут соответствовать протоколам». Если я использую метод класса, который делает то, что мне нужно, например:

          if this > that {       
      someClass.doIt()
    }

Я получаю ту же ошибку.

Как правильно это сделать?

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 отображается в представлении.

Если вы уточните, что вы пытаетесь сделать, возможно, ответ можно будет уточнить, но это источник ошибки.

Как предлагается в комментариях, вы также можете запустить код логики в onAppear, так:

      var body: some View {
  VStack {
   //view code
  }.onAppear {
   //logic
    if this > that {
      someVar = 1
    } 
  }
}
Другие вопросы по тегам