Почему модификатор вида не может принимать неизменяемую переменную?
Я сделал модификатор кнопки, цвет фона должен меняться в зависимости от того, был ли он нажат или нет. Но я получаю жалобу, что входной параметр 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))
}
}