2016-05-15 59 views
1

为了编写一个NSValueTransformer的通用代码,我需要能够检查一个枚举类型为String的例子。即:在Swift中,是否有一种确定枚举是否基于某种类型(例如字符串)的方法?

enum TestEnum: String { 
    case Tall 
    case Short 
} 

我特别感兴趣的是可以与guard语句一起使用的测试。以下几行是:

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

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

enum Test2Enum { 
    case Fat 
    case Slim 
} 

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

编辑

经过一番深入调查这已经很清楚,NSValueTransformer不能用于改造斯威夫特枚举。请参阅我在Matt的回答中的第二条评论。

+0

取任何情况下的原始值,看看它是什么类型。 – matt

+0

感谢马特,但不是所有枚举都有原始类型。例如。枚举Test2Enum {...}。因为它没有“继承”形式的类型,所以它没有原始值。 –

+0

但是它不能成为RawRepresentable,这很容易找出 – matt

回答

1

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

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 
+0

在我的情况下,“f(E1.One)//编译错误”需要编译并返回false。其实我需要找出一个var类型的AnyObject?是一个基于字符串的枚举。 –

+0

实际上,它看起来像Swift中的枚举是一个值类型(即任何不是AnyObject),无论它是原始值。不幸的是,NSValueTransformer强加了一个带有AnyObject参数的方法签名,因此不能用于转换Swift枚举。我将对这个答案进行投票,因为它实际上检查了枚举的原始值类型。 –

+0

我不认为你正在理解我的答案或Swift语言的性质。没有未知的枚举类型可以进入你的手中。 Swift中的类型在编译时严格确定。 – matt

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 
相关问题