Прежде всего - это мои первые шаги с ObservableObjects и, возможно, это просто небольшая ошибка ...
Я пытаюсь создать рейтинговую панель со звездами (с помощью учебника Пола Хадсона), но с переменной который будет использоваться более чем в двух представлениях, поэтому мне нужен ObservableObject.
Рейтинг создается в Rating.swift, будет вызываться в FeedbackView.swift, а FeedbackView.swift будет вызываться TabBar из EKLComplete. swift.
Я попробовал «путь Пола Хадсона» с переменной @Binding, но мой код не работал так же, как в учебнике Паулса. Все мои представления хотят иметь переменную, которая является правильной - из-за привязки. В моем понимании @Binding позволяет мне делить переменную с двумя представлениями, в моем случае мое представление EKLComplete также хочет знать значение, поэтому это должен быть ObservableObject, верно?
После создания класса:
class UserRating : ObservableObject {
@Published private var rating = 4
}
И экземпляр переменной со следующим кодом в 3-х видах
@EnvironmentObject var rating : UserRating
Это мой код, который выдает ошибка.
struct Rating: View {
@EnvironmentObject var rating : UserRating
var label = ""
var maximumRating = 5
var offImage: Image?
var onImage = Image(systemName: "star.fill")
var offColor = Color.gray
var onColor = Color.yellow
var body: some View {
HStack{
if label.isEmpty == false {
Text(label)
}
ForEach(1..<maximumRating + 1) { number in
self.image(for: number)
///ERROR 1
.foregroundColor(number > self.rating ? self.offColor : self.onColor)
.onTapGesture {
self.rating = number
print("Tap gesture!")
}
}
}
}
func image(for number: Int) -> Image {
///ERROR 2
if number > rating {
return offImage ?? onImage
} else {
return onImage
}
}
}
Я получаю следующее сообщение об ошибке:
Операторская функция '>' требует, чтобы 'UserRating' соответствовал 'BinaryInteger'
Это не работает ... 1. Скажите, что мой рейтинг - Int 2. Инициализируйте рейтинг в моем классе
class UserRating : ObservableObject {
@Published private var rating : Int = 4
}
class UserRating : ObservableObject {
@Published private var rating = 4
init(rating: Int) {
self.rating = rating
}
}
Спасибо за вашу помощь!