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

时间:2018-03-22 15:41:24

标签: swift enums

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

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的“数字”永远不会被修改,等等)。这些值是最终的。

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

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

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

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

1 个答案:

答案 0 :(得分: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

但是如果你有数百个值,你可能想放弃枚举。枚举非常适合于声明离散值的详尽列表,例如北,南,东,西。此外,枚举声明了一种类型,这就是为什么它的大写,这让我觉得你正在尝试使用枚举来声明一个属性而不应该使用它。欢呼声。