【问题标题】:Get enum from value从值中获取枚举
【发布时间】:2015-09-15 17:16:34
【问题描述】:

我对 Swift 中的 enum 有疑问。 我这样声明我的枚举:

enum FirstEnum : CustomStringConvertible {
    case VALUE1
    case VALUE2
    case VALUE3

    var description: String {
        switch self {
            case .VALUE1:
                return "First value"
            case .VALUE2:
                return "Second value"
            case .VALUE3:
                return "Third value"
        }
    }

    func getFromCode(value:String) -> FirstEnum? {
        switch value {
            case "v1":
                return FirstEnum.VALUE1
            case "v2":
                return FirstEnum.VALUE2
            case "v3" :
                return FirstEnum.VALUE3
        }
    }

我需要从一个字符串(如字典)中获取枚举,所以我希望这行应该可以工作:

let foo = FirstEnum.getFromCode("v1") 

但是 XCode (7) 期望方法 getFromCode 的 FirstEnum 参数,而不是方法定义中声明的 String,说:

无法将“字符串”类型的值转换为预期的参数类型 “第一个枚举”

为什么会这样?...我做错了什么?

【问题讨论】:

    标签: ios swift enums


    【解决方案1】:

    使用Failable Initializers for Enumerations

    您可以使用可失败的初始化程序来选择合适的 基于一个或多个参数的枚举成员。初始化器 如果提供的参数与适当的参数不匹配,则可能会失败 枚举成员。

    下面的示例定义了一个名为 TemperatureUnit 的枚举,其中 三种可能的状态(开尔文、摄氏和华氏)。一个失败的 初始化器用于为一个合适的枚举成员 代表温度符号的字符值:

    enum TemperatureUnit {
        case Kelvin, Celsius, Fahrenheit
        init?(symbol: Character) {
            switch symbol {
            case "K":
                self = .Kelvin
            case "C":
                self = .Celsius
            case "F":
                self = .Fahrenheit
            default:
                return nil
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      在 Swift 中,您可以从 String 派生您的枚举。

      enum FirstEnum : String {
          case VALUE1 = "First value"
          case VALUE2 = "Second value"
          case VALUE3 = "Third value"
      
          static func getFromCode(value:String) -> FirstEnum? {
              switch value {
              case "v1":
                  return FirstEnum.VALUE1
              case "v2":
                  return FirstEnum.VALUE2
              case "v3" :
                  return FirstEnum.VALUE3
              default:
                  return nil
              }
          }
      }
      

      另外,您的 getFromCode 方法应该是静态的并且需要一个默认子句。

      但是当你从 String 派生时你不需要这个方法。要构造您的枚举值,您可以使用rawValue,如下所示:

      let value = FirstEnum(rawValue: "First value")
      

      【讨论】:

        【解决方案3】:

        你需要一个 static 函数,这样你就可以在没有枚举实例的情况下调用它:

        static func getFromCode(value:String) -> FirstEnum? {
            switch value {
            case "v1":
                return FirstEnum.VALUE1
            case "v2":
                return FirstEnum.VALUE2
            case "v3" :
                return FirstEnum.VALUE3
            default:
                return nil
            }
        }
        

        您收到错误是因为在调用作为枚举实例的方法时存在隐藏参数。诚然,错误信息可能会更好。

        没有static,你需要一个枚举实例来调用它。请注意,这适用于您定义的函数:

        let foo = FirstEnum.VALUE3.getFromCode("v1")
        

        另外,您的switch 需要详尽无遗,这就是我添加default 案例的原因。

        【讨论】:

        • ops..我忘记了 static 关键字!谢谢,现在它就像一个魅力!
        • 我认为这不是最好的解决方案。查看下面的枚举的失败初始化器
        猜你喜欢
        • 2013-04-07
        • 2012-12-28
        • 1970-01-01
        • 2010-11-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多