Вы не можете подкласс @State
, так как @State
является Struct
. Вы пытаетесь манипулировать своей моделью, поэтому вам не следует помещать эту логику в ваше представление. Вы должны, по крайней мере, полагаться на свою модель представления следующим образом:
class ContentViewModel: ObservableObject {
@Published var positiveInt = 0 {
didSet {
if positiveInt < 0 {
positiveInt = 0
}
}
}
}
struct ContentView: View {
@ObservedObject var contentViewModel = ContentViewModel()
var body: some View {
VStack {
Text("\(contentViewModel.positiveInt)")
Button(action: {
self.contentViewModel.positiveInt = -98
}, label: {
Text("TAP ME!")
})
}
}
}
Но поскольку SwiftuUI не является фреймворком, управляемым событиями (все дело в данных, модели, привязке и т. Д.), Мы должны привыкнуть нереагировать на события, но вместо этого спроектировать наш взгляд так, чтобы он «всегда соответствовал модели». В вашем примере и в моем ответе здесь выше мы реагируем на целочисленное изменение, переопределяя его значение и заставляя представление быть созданным снова. Лучшим решением может быть что-то вроде:
class ContentViewModel: ObservableObject {
@Published var number = 0
}
struct ContentView: View {
@ObservedObject var contentViewModel = ContentViewModel()
private var positiveInt: Int {
contentViewModel.number < 0 ? 0 : contentViewModel.number
}
var body: some View {
VStack {
Text("\(positiveInt)")
Button(action: {
self.contentViewModel.number = -98
}, label: {
Text("TAP ME!")
})
}
}
}
Или даже проще (поскольку в принципе больше нет логики):
struct ContentView: View {
@State private var number = 0
private var positiveInt: Int {
number < 0 ? 0 : number
}
var body: some View {
VStack {
Text("\(positiveInt)")
Button(action: {
self.number = -98
}, label: {
Text("TAP ME!")
})
}
}
}