установка вычисляемого свойства в представлении SwiftUI не компилируется

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

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
    }
  }
}

person mica    schedule 28.02.2020    source источник
comment
Вы пытаетесь воспроизвести поведение @State ... почему? Представление - это структура, значение, оно не может изменяться изнутри, поэтому есть @State - это то, что вы пытаетесь сделать. Просто используйте это.   -  person Asperi    schedule 28.02.2020
comment
@Asperi Я хочу изменить некоторые другие состояния при установке s, я расширю пример   -  person mica    schedule 28.02.2020


Ответы (2)


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

  private var s : String
  { get { _s }
    nonmutating set (new)
    { _s = "no test"
      _s2 = false
      // do something else
    }
  }
person Asperi    schedule 28.02.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)
        }
    }
}
person user3441734    schedule 28.02.2020
comment
Я хочу изменить некоторые другие состояния при установке s, я расширю пример - person mica; 28.02.2020