【问题标题】:How do I store hundreds of enums so they can be accessed efficiently?如何存储数百个枚举以便有效访问它们?
【发布时间】:2025-12-27 14:45:16
【问题描述】:

假设我有一个公共枚举,每个枚举都有多个关联值。我目前将它们存储为:

public enum foo {
    case A
    case B
    case C
    case ... //goes on for hundreds of enums
}

为了访问一个值,我使用 switch 语句(在枚举中)进行线性搜索:

func getNumber() -> Int { //multiple functions just like this for each A, B, C...
    switch self {
    case .A: return 102  //numbers are arbitrary
    case .B: return 438
    case .C: return 293
    case ... //and so on
    }
}

func getName() -> String {
    switch self {
    case .A: return "Apple" //names are arbitrary as well...
    case .B: return "Banana"
    case .C: return "Cherry"
    case ...
    }
}

func ...

但是,要访问列表底部的某些内容,我必须遍历枚举的每个值,这必须每秒执行多次。我觉得好像这非常低效。理想情况下,我希望能够:

  • 存储多个元素,每个元素都有自己的值。每个元素都应该有多个与之关联的相似变量(名称、重量、大小等),只是每个变量的值不同。

  • 无需遍历 switch 语句即可访问每个枚举。例如,如果用户输入 foo.B.number(),理想情况下它会返回“438”,而不必遍历每个元素。

  • 不会改变(B 的“数字”永远不会被修改,等等)。这些值为最终值。

  • 能够使用字符串访问某个枚举。例如,如果“Apple”与 foo 的“A”相关联,则可以调用这样的函数:

    func getFoo(s:String) -> foo { ... }

    getFoo(s:"Apple") //应该返回 A

我可以做些什么来存储和访问这些?

【问题讨论】:

  • Swift 命名约定以大写字母开头并以小写字母开头。
  • 是什么让您认为切换是线性搜索?如果有足够多的情况来保证它,编译器会构建一个(散列键控)查找表。尽管对于大多数用例(没有很多枚举用例的枚举),线性搜索实际上是最快的方法。

标签: swift enums


【解决方案1】:

在 swift 中最有效的方法是使用字典和元组(元组将数据组合在一起,字典是存储大量数据并有效查找数据的好方法)

public enum Foo {
 case A, B, C, D, E, F //and on
}

let dictionary: [Foo: (number: Int, name: String)] = [
.A: (102,"Apple")
]

// 然后调用值

let favoriteFruitOfA = dictionary[.A].name

但是,如果您有数百个值,您可能想放弃枚举。枚举非常适合声明离散值的详尽列表,例如北,南,东,西。此外,枚举声明了一个类型,这就是它被大写的原因,这让我认为您正在尝试使用枚举来声明一个属性并且不应该使用它。干杯。

【讨论】:

  • 我认为这是要走的路!快速提问,如果我只提供字符串“Apple”,我将如何获得 A?
  • 具有数百个值的枚举在某些用例中仍然占有一席之地。它们仍然保证 switch case 的详尽性,并且它们就像存储的常量一样。您会惊讶于我们的一个数据库中有多少“美国”实例,仅仅因为国家(及其名称)是一个枚举。美国,美国,美国,美国,美利坚合众国......
  • @Matt 你需要制作一个bimap *.com/a/47081889/3141234
  • @Matt 你可以简单地创建一个像:var fruitToFooMapping = { Dictionary(uniqueKeysWithValues: dictionary.lazy.map { keyValuePair in (keyValuePair.value.name, keyValuePair.key) }) }()
  • 亚历山大是对的。此外,如果您在导航某些闭包语法时遇到问题,这可能会让您朝着正确的方向前进:*.com/questions/27218669/…