为了编写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的回答中的第二条评论。
答案 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