从价值中获取枚举

时间:2015-09-15 17:16:34

标签: ios swift enums

我对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)期望方法FirstEnum的{​​{1}}参数而不是方法定义中声明的getFromCode,说:

  

无法将“String”类型的值转换为预期的参数类型   “FirstEnum”

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

3 个答案:

答案 0 :(得分:5)

使用Failable Initializers for Enumerations

  

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

     

下面的示例定义了一个名为TemperatureUnit的枚举   三种可能的状态(Kelvin,Celsius和Fahrenheit)。一个可用的   初始化程序用于为a查找适当的枚举成员   表示温度符号的字符值:

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
        }
    }
}

答案 1 :(得分:4)

在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")

答案 2 :(得分:3)

您需要一个static func,以便您可以在没有枚举实例的情况下调用它:

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案例的原因。