【发布时间】:2021-06-05 11:03:30
【问题描述】:
在其他语言中,我可以构造复杂的枚举,它为每种情况保存多个值/一个类/一个结构。这在 Swift 中似乎是不可能的。至少我找不到一个简单的解决方案。到目前为止,我提出了这些可能性,其中包括一些样板文件,并且不像我习惯的其他语言那样优雅。
每种解决方案的缺点是什么?还有什么我可以做的吗?类会是更好的解决方案吗?
最后,我想要一个有限的、独特的、可迭代的不可变值构造。我希望这是一个枚举,因为它们通常有好处,比如知道它们何时被彻底匹配。
enum CategoryEnum: Int, CaseIterable {
case general = 9
case tech = 5
var value: Category? {
switch rawValue {
case 9:
return Category(name: "General Knowledge", id: rawValue, symbol: Image(systemName: "globe"))
case 5:
return Category(name: "Technical", id: rawValue, symbol: Image(systemName: "internaldrive"))
default:
return nil // or throw error to ged rid of optional?
}
}
}
struct Category {
static let GENERAL = Category(name: "General Knowledge", id: 9, symbol: Image(systemName: "globe"))
static let TECH = Category(name: "Technical", id: 5, symbol: Image(systemName: "internaldrive"))
static private let cases: [Int: Category] = [
GENERAL.id: GENERAL,
TECH.id: TECH
]
static func fromId(_ id: Int) -> Category? {
Category.cases[id]
}
static func values() -> Dictionary<Int, Category>.Values {
cases.values
}
let name: String
let id: Int
let symbol: Image
}
func testWithEnum() {
// iterating over all cases
for cat in CategoryEnum.allCases {
print(cat.value!.name)
}
// getting a case from the id
let catGen = CategoryEnum(rawValue: 9)
print(catGen!.value!.name)
// a specific case
print(CategoryEnum.general.value!.name)
}
func testWithStruct() {
// iterating over all cases
for cat in Category.values() {
print(cat.name)
}
// getting a case from the id
print(Category.fromId(9)!.name)
// a specific case
print(Category.TECH.name)
}
【问题讨论】: