【问题标题】:Using two enums in Swift在 Swift 中使用两个枚举
【发布时间】:2019-12-29 09:10:08
【问题描述】:

我有两个枚举 ItemsFilters

enum Items: Int {
    case ItemA = 0,
    ItemB,
    ItemC,
    ItemD,
    ItemE

}


enum Filters: Int {
    case FilterA = 0,
    FilterB

}

我需要将 Items 枚举放在 Int 中。 我正在尝试实现Filters 枚举,以便:

Filters(0).filter() 返回[ItemA, ItemB]

Filters(1).filter() 返回[ItemC, ItemD, ItemE]

Filters(0).count() 返回2

Filters(1).count() 返回3

Swift 中的枚举与我从 C 中了解枚举的方式大不相同......无法掌握。谢谢!

【问题讨论】:

  • 你想达到什么目的?似乎Filters 可能根本不需要是枚举,只是一些静态变量。它们的用途是什么?您打算如何使用它们?

标签: swift enums swift5


【解决方案1】:

您的代码中有几个错误和不良做法。

  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

【讨论】:

  • 正是我需要的。谢谢你的中肯解释:)
【解决方案2】:

希望对您有用:

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)

仅供参考,快速案例应该以本书的小写字母开头,与您的问题代码 sn-p 相比,我将它们保留为大写,以免造成更多混乱。

【讨论】:

    【解决方案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)
    }
    

    【讨论】:

      猜你喜欢
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-09
      • 1970-01-01
      • 2020-10-19
      • 2017-04-01
      相关资源
      最近更新 更多