Операторская функция «>» требует, чтобы «UserRating» соответствовал «BinaryInteger» - SwiftUI ObservableObject - PullRequest
0 голосов
/ 02 апреля 2020

Прежде всего - это мои первые шаги с 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

enter image description here

Это мой код, который выдает ошибка.

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
    }
 }

Спасибо за вашу помощь!

1 Ответ

1 голос
/ 02 апреля 2020

Вы ссылаетесь на владелец объекта , а не на свойство Int. Попробуйте:

.foregroundColor(number > self.rating.rating ? self.offColor : self.onColor)

и:

if number > rating.rating {
    // do your work
}

Также рассмотрите возможность изменения имени вашего объекта среды на userRating, чтобы не путаться.

if number > userRating.rating { }
...