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