我的 LoadingState 定义如下:
enum LoadingState<T: Codable> {
case none
case loading
case success(T)
case error(Error)
}
电影定义如下:
struct Movie: Codable {
let title: String
}
在我的 SwiftUI 视图中,我尝试使用任务(id)修饰符,如下所示:
struct ContentView: View {
@State private var loadingState: LoadingState<Movie> = .none
var body: some View {
VStack {
Button("Perform Time Consuming Operation") {
loadingState = .loading
}.buttonStyle(.borderedProminent)
}.task(id: loadingState) {
}
}
}
但是我收到以下错误:
Instance method 'task(id:priority:_:)' requires that 'LoadingState<Movie>' conform to 'Equatable'
有什么想法吗?
您必须使您的类型符合
Equatable
。正是错误消息所说的内容。
对于您的
Movie
类型,它可以自动生成,您只需将 Equatable
协议名称添加到声明中:
struct Movie: Codable, Equatable { // <- here
let title: String
}
对于
enum
来说有点棘手,如果你希望它只与T
同时也是Equatable
一起工作,你可以将其声明为
enum LoadingState<T: Codable & Equatable>: Equatable {
// case … case … etc
}
// or
enum LoadingState<T>: Equatable where T: Codable, T: Equatable {
// case … case … etc
}
或者,如果您希望
LoadingState
与任何 T
一起使用,但要符合 Equatable
iff T
也是 Equatable
,您必须在扩展中执行此操作(保留原始枚举声明):
extension LoadingState: Equatable where T: Equatable { }
您可能还需要对
.error(Error)
大小写做一些事情,它可能想要将其声明为泛型类型并将 Equatable
附加到它,就像我们上面对 T
所做的那样。