运算符函数'>'要求'UserRating'符合'BinaryInteger'-SwiftUI ObservableObject

时间:2020-04-02 08:53:07

标签: swift observableobject

首先-这些是我使用ObservableObjects的第一步,也许只是一个小错误...

我尝试创建带有星号的评级栏(带有Paul Hudson教程),但是要使用一个变量,该变量将在2个以上的视图中使用,所以我需要一个ObservableObject。

评级是在Rating.swift中创建的,将在FeedbackView.swift中调用,而FeedbackView.swift将由EKLComplete.swift的TabBar调用。

我使用@Binding var尝试了“ Paul Hudson Way”,但是我的代码与Pauls Tutorial的工作方式不同。我的视图都希望具有变量,这是正确的-因为存在Binding。 以我的理解,@Binding允许我与2个视图共享变量,就我而言,我的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.假设我的评级是整数 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 个答案:

答案 0 :(得分:1)

您引用的是拥有的对象,而不是基于Int的属性。试试:

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

和:

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

另外,请考虑将环境对象的名称更改为userRating,以免混淆。

if number > userRating.rating { }