在 Swift 中使用两个枚举
Using two enums in Swift
我有两个枚举 Items
和 Filters
作为
enum Items: Int {
case ItemA = 0,
ItemB,
ItemC,
ItemD,
ItemE
}
enum Filters: Int {
case FilterA = 0,
FilterB
}
我需要让 Items 枚举在 Int 中。
我正在尝试实现 Filters
枚举,以便:
Filters(0).filter()
returns [ItemA, ItemB]
Filters(1).filter()
returns [ItemC, ItemD, ItemE]
Filters(0).count()
returns 2
Filters(1).count()
returns 3
swift 中的枚举与我从 C 中了解枚举的方式大不相同...无法掌握。谢谢!
希望对您有所帮助:
enum Items: Int {
case ItemA = 0,
ItemB,
ItemC,
ItemD,
ItemE
}
enum Filters: Int {
case FilterA = 0,
FilterB
func items() -> [Items]? {
switch self {
case .FilterA:
return [Items.ItemA, Items.ItemB]
case .FilterB:
return [Items.ItemC]
}
return nil
}
func count() -> Int {
return items()?.count ?? 0
}
}
let filter = Filters.FilterA
filter.items()
filter.count()
您也可以像这样实例化过滤器枚举:
let filter = Filters(rawValue: 0)
仅供参考 swift 书中的案例应该以小写字母开头,我将它们保留为大写字母,以免与您的问题代码片段相比造成更多混淆。
您的代码中存在一些错误和不良做法。
- 枚举名称必须是单数
- 枚举案例名称应以小写字母开头
- 枚举案例名称不应包含枚举本身的名称(例如
a
而不是 ItemA
)
- IMO 的过滤和计数方法应该添加到
Item
枚举中
- 过滤器和计数方法应接收
Filter
值,而不是 Int
- 您可以自由地将
0
分配给第一种情况,但这不是必需的,因为编译器会为您完成
- IMO
Condition
是 Filter
枚举的更好名称
解决方案
这是我的解决方案
enum Condition: Int {
case a, b
}
enum Item: Int {
case a, b, c, d, e
static func filter(with condition: Condition) -> [Item] {
switch condition {
case .a: return [.a, .b]
case .b: return [.c, .d, .e]
}
}
static func count(with condition: Condition) -> Int {
return filter(with: condition).count
}
}
用法
Item.filter(with: .a) // [a, b]
Item.filter(with: .b) // [c, d, e]
Item.count(with: .a) // 2
Item.count(with: .b) // 3
由于这看起来像静态数据,一个简单的解决方案是将不同的枚举元素集保存在字典中。我同意另一位发帖者的观点,您的枚举的命名可能会更好
enum Item: Int {
case a, b, c, d, e
}
let itemFilter = [0: [Item.a, Item.b]],
[1: [Item.c, Item.d, Item.e]]
if let filter = itemFilter[0] {
print(filter)
print(filter.count)
}
我有两个枚举 Items
和 Filters
作为
enum Items: Int {
case ItemA = 0,
ItemB,
ItemC,
ItemD,
ItemE
}
enum Filters: Int {
case FilterA = 0,
FilterB
}
我需要让 Items 枚举在 Int 中。
我正在尝试实现 Filters
枚举,以便:
Filters(0).filter()
returns [ItemA, ItemB]
Filters(1).filter()
returns [ItemC, ItemD, ItemE]
Filters(0).count()
returns 2
Filters(1).count()
returns 3
swift 中的枚举与我从 C 中了解枚举的方式大不相同...无法掌握。谢谢!
希望对您有所帮助:
enum Items: Int {
case ItemA = 0,
ItemB,
ItemC,
ItemD,
ItemE
}
enum Filters: Int {
case FilterA = 0,
FilterB
func items() -> [Items]? {
switch self {
case .FilterA:
return [Items.ItemA, Items.ItemB]
case .FilterB:
return [Items.ItemC]
}
return nil
}
func count() -> Int {
return items()?.count ?? 0
}
}
let filter = Filters.FilterA
filter.items()
filter.count()
您也可以像这样实例化过滤器枚举:
let filter = Filters(rawValue: 0)
仅供参考 swift 书中的案例应该以小写字母开头,我将它们保留为大写字母,以免与您的问题代码片段相比造成更多混淆。
您的代码中存在一些错误和不良做法。
- 枚举名称必须是单数
- 枚举案例名称应以小写字母开头
- 枚举案例名称不应包含枚举本身的名称(例如
a
而不是ItemA
) - IMO 的过滤和计数方法应该添加到
Item
枚举中 - 过滤器和计数方法应接收
Filter
值,而不是Int
- 您可以自由地将
0
分配给第一种情况,但这不是必需的,因为编译器会为您完成 - IMO
Condition
是Filter
枚举的更好名称
解决方案
这是我的解决方案
enum Condition: Int {
case a, b
}
enum Item: Int {
case a, b, c, d, e
static func filter(with condition: Condition) -> [Item] {
switch condition {
case .a: return [.a, .b]
case .b: return [.c, .d, .e]
}
}
static func count(with condition: Condition) -> Int {
return filter(with: condition).count
}
}
用法
Item.filter(with: .a) // [a, b]
Item.filter(with: .b) // [c, d, e]
Item.count(with: .a) // 2
Item.count(with: .b) // 3
由于这看起来像静态数据,一个简单的解决方案是将不同的枚举元素集保存在字典中。我同意另一位发帖者的观点,您的枚举的命名可能会更好
enum Item: Int {
case a, b, c, d, e
}
let itemFilter = [0: [Item.a, Item.b]],
[1: [Item.c, Item.d, Item.e]]
if let filter = itemFilter[0] {
print(filter)
print(filter.count)
}