2016-05-15 60 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 
相關問題