在Swift中,有没有办法确定枚举是否基于某种类型(例如字符串)?

时间:2016-05-15 00:49:30

标签: swift enums

为了编写NSValueTransformer的通用代码,我需要能够检查枚举是否为String类型。即:

enum TestEnum: String {
  case Tall
  case Short
}

我特别感兴趣的是可以与警卫声明一起使用的测试。有些东西:

guard let e = myEnum as <string based enum test> else {
  // throw an error
}

请注意,并非所有枚举都有原始值。例如:

enum Test2Enum {
  case Fat
  case Slim
}

因此,对原始值类型的检查不能单独用于此目的。

修改

经过进一步调查后,很明显NSValueTransformer不能用于转换Swift枚举。请参阅matt的回答中的第二条评论。

2 个答案:

答案 0 :(得分:1)

首先,它是您的枚举,因此您无法 知道它们的类型。其次,您不会收到枚举类型,而是枚举实例。第三,即使你坚持假装不知道这个枚举是什么类型,也可以很容易地创建一个只能使用具有原始值的枚举来调用的函数,并检查原始值的类型: / p>

enum E1 {
    case One
    case Two
}
enum E2 : String {
    case One
    case Two
}
enum E3 : Int {
    case One
    case Two
}

func f<T:RawRepresentable>(t:T) -> Bool {
    return T.RawValue.self == String.self
}

f(E3.One) // false
f(E2.One) // true
f(E1.One) // compile error

答案 1 :(得分:0)

拯救的泛型:

func enumRawType<T>(of v:T)-> Any? 
{ return nil }

func enumRawType<T:RawRepresentable>(of v:T)-> Any?
{ 
  return type(of:v.rawValue)
}


enumRawType(of:E1.One) // nil
enumRawType(of:E2.One) // String.Type
enumRawType(of:E3.One) // Int.Type