Альтернативная константа привязки, но Изменяемая

#swiftui

Вопрос:

У меня есть такой вид:

 struct View1: View {  @Binding var myVariable: Bool    init() {  _myVariable = Binding.constant(true) // It works but myVariable is immutable, so I can't edit myVariable  }    init(myVariable: Bindinglt;Boolgt;) {  _myVariable = myVariable  }    var body: some View {  Button("Change") {  myVariable.toggle()  }  } }  struct View2: View {  var body: some View {  View1()  } }  struct View3: View {  @State var myVariable = false   var body: some View {  View1(myVariable: $myVariable)  } }  

И я хочу сделать следующее: если есть предоставленный параметр, установите его в значение myVariable, например, второй инициализации в View1. В противном случае установите первое значение myVariable, как в первом инициализации.

Я пытался использовать Binding.constant(значение), но оно неизменяемо. И я не могу редактировать переменную. Итак, мне нужен изменяемый инициализатор привязки, такой как Binding.constant(значение). Но я не могу его найти.

Как я могу решить эту проблему?

Комментарии:

1. Пожалуйста, проясните вашу конкретную проблему или предоставьте дополнительные сведения, чтобы выделить именно то, что вам нужно. Поскольку это написано в настоящее время, трудно точно сказать, о чем вы просите.

Ответ №1:

Чтобы избежать чрезмерного усложнения View1 , вы можете создать промежуточное представление с таким именем, а затем создать private «внутреннее» представление, имеющее фактическую реализацию.

Код:

 private struct View1Internal: View {  @Binding var myVariable: Bool   var body: some View {  Button("Change") {  myVariable.toggle()  }  } }  
 struct View1: View {  private enum Kind {  case state  case binding(Bindinglt;Boolgt;)  }   @State private var state = true  private let kind: Kind   init() {  kind = .state  }   init(myVariable: Bindinglt;Boolgt;) {  kind = .binding(myVariable)  }   var body: some View {  switch kind {  case .state: View1Internal(myVariable: $state)  case .binding(let binding): View1Internal(myVariable: binding)  }  } }