在 Swift 中使用两个枚举

Using two enums in Swift

我有两个枚举 ItemsFilters 作为

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 书中的案例应该以小写字母开头,我将它们保留为大写字母,以免与您的问题代码片段相比造成更多混淆。

您的代码中存在一些错误和不良做法。

  1. 枚举名称必须是单数
  2. 枚举案例名称应以小写字母开头
  3. 枚举案例名称不应包含枚举本身的名称(例如 a 而不是 ItemA
  4. IMO 的过滤和计数方法应该添加到 Item 枚举中
  5. 过滤器和计数方法应接收 Filter 值,而不是 Int
  6. 您可以自由地将 0 分配给第一种情况,但这不是必需的,因为编译器会为您完成
  7. IMO ConditionFilter 枚举的更好名称

解决方案

这是我的解决方案

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)
}