LoadingState<Movie>符合Equatable

问题描述 投票:0回答:1

我的 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'

有什么想法吗?

ios swiftui
1个回答
1
投票

您必须使您的类型符合

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
所做的那样。

© www.soinside.com 2019 - 2024. All rights reserved.