установка вычисляемого свойства в представлении SwiftUI не компилируется - PullRequest
2 голосов
/ 28 февраля 2020

Попытка установить вычисляемое свойство s в представлении SwiftUI приводит к ошибке компилятора «Невозможно присвоить свойству:« self »является неизменным».
Как мне вызвать метод setter?

struct Test: View{
  @State var _s = "test"
  @State var _s2 = true
  private var s : String
  { get { _s }
    set (new)
    { _s = "no test"
      _s2 = false
      // do something else
    }
  }

  var body: some View
  { Text("\(s)")
    .onTapGesture {
      self.s = "anyting"  // compiler error
    }
  }
}

Ответы [ 2 ]

2 голосов
/ 28 февраля 2020

Ага ... Понятно. Просто используйте не мутирующий набор

  private var s : String
  { get { _s }
    nonmutating set (new)
    { _s = "no test"
      _s2 = false
      // do something else
    }
  }
1 голос
/ 28 февраля 2020

Именно поэтому у вас уже есть оболочка свойства @State в вашем представлении.

struct Test: View{
  @State var s = "test"
    var body: some View {
    Text("\(s)")
    .onTapGesture {
      self.s = "anyting"  // compiler error
    }
  }
}

Вы можете изменить s непосредственно из своего кода, поскольку s обернут в @ State.

это функциональный эквивалент вышеупомянутого

struct Test: View{
    let s = State<String>(initialValue: "alfa")
    var body: some View {
        VStack {
            Text("\(s.wrappedValue)")
                .onTapGesture {
                    self.s.wrappedValue = "beta"
            }
        }
    }
}

или, если необходимо связывание

struct Test: View{
    let s = State<String>(initialValue: "alfa")
    var body: some View {
        VStack {
            TextField("label", text: s.projectedValue)
        }
    }
}
...