【问题标题】:How to create enum from a String如何从字符串创建枚举
【发布时间】:2015-06-09 19:59:47
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: swift enums swift2


    【解决方案1】:

    您可以为枚举创建一个以String 作为参数的初始化程序。从那里,您切换字符串以将 self 的值设置为特定情况,如下所示:

    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
    

    【讨论】:

    • 据我所知,这是使用 Int 枚举而不是 String 枚举的最佳方式,但可能存在更好的方式。
    • 奇怪的是,我的 init(name:String) 在项目源代码中隐藏了 init(rawValue:Int),但在游乐场中没有。 stackoverflow.com/questions/30742475/…
    • @RobN 我们无法通过使用反射或 rawValue 实现您想要的。我认为这个答案是最好的。
    【解决方案2】:

    周围没有编译器来检查细节,但类似:

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

    【讨论】:

    • 好的,看到你的编辑,这不是你需要的。不过,我会把它留在这里作为其他人的可能信息。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      Ian 的回答很好,但根据您的需要,您可能更喜欢带有可失败初始化程序的枚举:

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-23
        • 1970-01-01
        • 2011-04-28
        相关资源
        最近更新 更多