swift - 我如何存储数百个枚举以便可以有效地访问它们?

标签 swift enums

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

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 中最有效的方法是使用字典和元组(元组将数据组合在一起,字典是存储大量数据并高效查找数据的好方法)

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

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

关于swift - 我如何存储数百个枚举以便可以有效地访问它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49432830/

相关文章:

ios - 执行自定义 segue 时调用不平衡

javascript - 如何在 iOS 的 Web 套接字中查看 ping pong

ios - 从 Swift 函数中的异步调用返回数据

c++ - 错误:没有匹配的函数调用vector::push_back

mysql - 为什么 ENUM 不在 MySQL 中存储多个值?

swift - 测试和项目文件的 Xcode 目标成员资格

ios - 自定义注释标注 View 还是自定义 View ?

java - 在 Hibernate 中映射 Java 8 月份枚举列表

java - 希望使用2个枚举来描述java中的类并将它们分配给主函数中的类

java - 使用 Jackson 自定义枚举常量名称