我有一个带有关联属性的EnumCategoryType
,我想在我的视图中使用它来列出来自enum的所有案例。
我可以使用CaseIterable
和Identifiable
作为我的枚举以及相关属性,这就是为什么它有点棘手。
我尝试使用计算属性allCases
来列出所有情况,但它仍然无法编译。
我得到这些错误:
Generic struct 'Picker' requires that 'CategoryType' conform to 'Hashable'
Referencing initializer 'init(_:content:)' on 'ForEach' requires that 'CategoryType' conform to 'Identifiable'
enum CategoryType: Decodable, Equatable {
case psDaily, psWeekly, psMonthly
case unknown(value: String)
init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
let status = try? container.decode(String.self)
switch status {
case "Daily": self = .psDaily
case "Weekly": self = .psWeekly
case "Monthly": self = .psMonthly
default: self = .unknown(value: status ?? "unknown")
}
}
var allCases: [CategoryType] {
return [.psDaily, .psWeekly, .psMonthly]
}
var rawValue: String {
switch self {
case .psDaily: return "Daily"
case .psWeekly: return "Weekly"
case .psMonthly: return "Monthly"
case .unknown: return "Unknown"
}
}
}
以下是我看法:
import SwiftUI
struct CategoryPicker: View {
@Binding var selection: CategoryType
var body: some View {
NavigationStack {
Form {
Section {
Picker("Category", selection: $selection) {
ForEach(CategoryType().allCases) { category in
CategoryView(category: category)
.tag(category)
}
}
}
}
}
}
}
struct CategoryPicker_Previews: PreviewProvider {
static var previews: some View {
CategoryPicker(selection: .constant(.psDaily))
}
}
如何解决这些问题,或者是否有其他方法来实现它?
2条答案
按热度按时间p5fdfcr11#
首先,按照编译器的要求,使枚举符合
Hashable
和Identifiable
allCases
属性与self
无关,因此将其更改为static然后更改
ForEach
循环以使用此属性8dtrkrch2#
enum
s很棒,但有时你需要一个struct
。当可能有未知数时是一个完美的例子,因为你可以动态创建对象。然后,您可以在
View
中使用它,这与enum
非常相似,但它具有支持未知的优点。