Swift 如何存储数百个枚举,以便有效地访问它们?

Swift 如何存储数百个枚举,以便有效地访问它们?,swift,enums,Swift,Enums,假设我有一个公共枚举,每个枚举都有多个关联值。我目前将其存储为: public enum foo { case A case B case C case ... //goes on for hundreds of enums } 要访问值,我使用switch语句(在枚举中)进行线性搜索: 但是,要访问列表底部的内容,我必须遍历枚举的每个值,这必须每秒执行多次。我觉得这似乎效率很低。理想情况下,我希望能够: 存储多个元素,每个元素都有各自的值。每个元素都应该有多

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

public enum foo {
    case A
    case B
    case C
    case ... //goes on for hundreds of enums
}
要访问值,我使用switch语句(在枚举中)进行线性搜索:

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

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

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

  • 不可更改(B的“编号”永远不会修改,等等)。这些值是最终值

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

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

    getFoo(s:“Apple”)//应返回


如何存储和访问这些数据?

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

//然后调用这些值

let favoriteFruitOfA = dictionary[.A].name

但是,如果有数百个值,则可能需要放弃枚举。枚举非常适合声明离散值的详尽列表,例如北、南、东、西。此外,enum声明了一个类型,这就是它被大写的原因,这让我觉得您试图使用enum声明一个属性,而不应该使用它。干杯。

以大写字母开始命名枚举,以小写字母开始命名枚举,这是一种快速命名惯例。您为什么认为切换会进行线性搜索?如果有足够多的情况可以证明这一点,编译器将构建一个(哈希键控的)查找表。虽然对于大多数用例(没有很多枚举用例的枚举),线性搜索实际上是最快的方法。我认为这是最好的方法!快速提问,如果只向我提供字符串“Apple”,我将如何获得一个值?在某些用例中,具有数百个值的枚举仍然占有一席之地。它们仍然保证了在开关情况下的耗尽性,并且它们的行为就像存储的常量一样。你会惊讶于我们的一个数据库中有多少“USA”的实例,仅仅因为国家(及其名称)有一个枚举。美国,美国,美国,美国,美利坚合众国…@Matt你需要制作一个bimap@Matt你可以简单地创建一个这样的:
var-fruitToFooMapping={Dictionary(uniqueKeysWithValues:Dictionary.lazy.map{keyValuePair in(keyValuePair.value.name,keyValuePair.key)}()
Alexander是正确的。此外,如果您在浏览某些闭包语法时遇到问题,这可能会使您朝着正确的方向前进:
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