我对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”
为什么这样?......我做错了什么?
答案 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
案例的原因。