Почему модификатор вида не может принимать неизменяемую переменную?

Я сделал модификатор кнопки, цвет фона должен меняться в зависимости от того, был ли он нажат или нет. Но я получаю жалобу, что входной параметр viewModifier неизменен.

Я получил ошибку на btnBkColor из

      .modifier(ActionButtonType(bkColor: btnBkColor))

Сообщение об ошибке:

Невозможно использовать изменяющийся получатель для неизменяемого значения: 'self' неизменяемо

Вот мой упрощенный код:

      struct MyView: View {
@State private var cond = false
private lazy var btnBkColor: Color = cond ? Color.orange : Color.green
var body: some View {
              Button(action: { cond.toggle() }, label: {
              Text(cond ? "A" : "B")
  })
  .modifier(ActionButtonType(bkColor: btnBkColor))
}
}

Модификатор:

      struct ActionButtonType: ViewModifier {
    let bkColor: Color
    func body(content: Content) -> some View {
        content
            .background(bkColor)
    }
}

Я получаю, но не устанавливаю btnBkColor внутри ViewModifier, я не понимаю, почему входной параметр не может быть неизменным?

Что я пробовал, но не помогло:

  • поменять пусть на var
  • добавить @State перед btnBkColor

Заранее большое спасибо.

2 ответа

Решение

Использовать вычисленное свойство. Вы не можете использовать переменную self напрямую с другой переменной.

      struct MyView: View {
    @State private var cond = false
    
    private var btnBkColor: Color {
        cond ? Color.orange : Color.green
    } // <--Here
    
    var body: some View {
        Button(action: { cond.toggle() }, label: {
            Text(cond ? "A" : "B")
        })
        .modifier(ActionButtonType(bkColor: btnBkColor))
    }
}

В простейшем случае, который чаще всего используется в коде SwiftUI, является использование зависимости состояния в строке модификатора (это также можно анимировать, когда / при необходимости)

      struct MyView: View {
  @State private var cond = false

  var body: some View {
      Button(action: { cond.toggle() }, label: {
         Text(cond ? "A" : "B")
      })
      .modifier(ActionButtonType(bkColor: cond ? Color.orange : Color.green))
  }
}
Другие вопросы по тегам