在Swift 2中,您可以从字符串创建枚举吗?如何从字符串创建枚举
enum Food : Int { case Pizza, Pancakes }
let str = "Pizza"
let food = Food(name:str) // for example
最后一行不起作用,但我正在寻找类似的东西。就像在Java中一样,你可以说Food.valueOf("Pizza")
。
编辑:我不能使用字符串作为原始值。
在Swift 2中,您可以从字符串创建枚举吗?如何从字符串创建枚举
enum Food : Int { case Pizza, Pancakes }
let str = "Pizza"
let food = Food(name:str) // for example
最后一行不起作用,但我正在寻找类似的东西。就像在Java中一样,你可以说Food.valueOf("Pizza")
。
编辑:我不能使用字符串作为原始值。
您可以为需要String
作为一个参数枚举创建一个初始化。从那里,你切换串自我的值设置为特定的情况下,像这样:
enum Food: Int {
case None, Pizza, Pancakes
init(string: String) {
switch string {
case "Pizza":
self = .Pizza
default:
self = .None
}
}
}
let foo = Food(string: "") // .None
let bar = Food(string: "Pizza") // .Pizza
您可以设置原始值为字符串的枚举,然后通过指定原始值来创建枚举。这与你所要求的接近。
没有一个编译器围绕检查细节,但喜欢的东西:
enum Food { case Pizza="Pizza", Pancakes="Pancakes" }
let str = "Pizza"
let food = Food(rawValue:str)
好吧,看到你的编辑,这不是你所需要的。尽管我会把它留在这里作为可能的信息。 –
伊恩的回答是伟大的,但,根据您的需求,您可能希望一个枚举用failable初始化:
enum Food: Int {
case Pizza, Pancakes
init?(name: String) {
switch name {
case "Pizza": self = .Pizza
case "Pancakes": self = .Pancakes
default: return nil
}
}
}
let pizzaString = "Pizza"
let food = Food(name: pizzaString) // returns .Pizza (optional)
print(food?.rawValue) // returns 0 (optional)
据我所知,这是使用Int枚举而不是String枚举的最佳方式,但可能存在更好的方法。 – Ian
奇怪的是,我的init(name:String)在项目源中隐藏了init(rawValue:Int),但不在游乐场中。 http://stackoverflow.com/questions/30742475/why-initrawvalue-not-callable-for-some-enums –
@RobN我们不能通过利用反射或rawValue实现你想要的。我认为这个答案是最好的。 –