我在C中有一个枚举,索引需要用String表示.
整数索引如何使用Swift枚举的String类型?
我想将枚举复制到Swift,将类型设置为字符串并定义所有原始值以显示文本,然后使用C enum值提取Swift String枚举的原始值文本.
否则我将只创建一个字符串数组..但枚举将更有用.
OOP*_*Per 35
在Swift中,枚举类型不包含其案例的索引信息(至少,不为程序员提供).
所以:
整数索引如何使用Swift枚举的String类型?
答案是"你不能".
您可以通过多种方式绑定Int(或枚举个案)和String值,而不仅仅是创建一个字符串数组.
例如,如果绑定的字符串可以与案例标签相同,则可以编写如下内容:
enum MyEnum: Int {
case foo
case bar
case baz
var string: String {
return String(self)
}
}
if let value = MyEnum(rawValue: 0) {
print(value.string) //->foo
}
Run Code Online (Sandbox Code Playgroud)
如果您的字符串需要更复杂一些来显示文本,您可以使用Swift Dictionary来绑定枚举案例和字符串.
enum AnotherEnum: Int {
case foo
case bar
case baz
static let mapper: [AnotherEnum: String] = [
.foo: "FooString",
.bar: "BarString",
.baz: "BazString"
]
var string: String {
return AnotherEnum.mapper[self]!
}
}
if let value = AnotherEnum(rawValue: 1) {
print(value.string) //->BarString
}
Run Code Online (Sandbox Code Playgroud)
比简单的字符串数组更具可读性.
Geo*_*kos 13
简单的解决方法,如果要枚举字符串枚举,这也很有用.
enum MyEnum: String {
case foo = "fooString"
case bar = "barString"
case baz = "bazString"
static let allValues = [foo, bar, baz] //must maintain second copy of values
}
//enumeration advantage
for value in MyEnum.allValues {
print(value)
}
//get value by index
let value = MyEnum.allValues[1]
print(value) //barString
Run Code Online (Sandbox Code Playgroud)
Bog*_*van 13
Swift 4.2引入CaseIterable了完全相同的功能,而无需声明allValues数组。它是这样的:
enum MyEnum: String, CaseIterable {
case foo = "fooString"
case bar = "barString"
case baz = "bazString"
}
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式访问其值
MyEnum.allCases
Run Code Online (Sandbox Code Playgroud)
或特定索引处的值
MyEnum.allCases[index]
Run Code Online (Sandbox Code Playgroud)