2015-06-09 98 views
1

在Swift 2中,您可以从字符串创建枚举吗?如何从字符串创建枚举

enum Food : Int { case Pizza, Pancakes } 
let str = "Pizza" 
let food = Food(name:str) // for example 

最后一行不起作用,但我正在寻找类似的东西。就像在Java中一样,你可以说Food.valueOf("Pizza")

编辑:我不能使用字符串作为原始值。

回答

5

您可以为需要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 
+0

据我所知,这是使用Int枚举而不是String枚举的最佳方式,但可能存在更好的方法。 – Ian

+0

奇怪的是,我的init(name:String)在项目源中隐藏了init(rawValue:Int),但不在游乐场中。 http://stackoverflow.com/questions/30742475/why-initrawvalue-not-callable-for-some-enums –

+0

@RobN我们不能通过利用反射或rawValue实现你想要的。我认为这个答案是最好的。 –

1

您可以设置原始值为字符串的枚举,然后通过指定原始值来创建枚举。这与你所要求的接近。

2

没有一个编译器围绕检查细节,但喜欢的东西:

enum Food { case Pizza="Pizza", Pancakes="Pancakes" } 
let str = "Pizza" 
let food = Food(rawValue:str) 
+0

好吧,看到你的编辑,这不是你所需要的。尽管我会把它留在这里作为可能的信息。 –

1

伊恩的回答是伟大的,但,根据您的需求,您可能希望一个枚举用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)