2014-07-14 77 views
5

我試圖創建一個字典變量,其值是兩種類型之一。我嘗試的例子會更好理解:Swift中的通用字典值類型

var objects: <T where T: Float, T: Bool>[String: T] 

此拋出,只有句法功能類型可以是通用的編譯錯誤。我想知道這是否可能,我只是不知道正確的語法?

回答

14

您想要的工具是一個帶有關聯數據的枚舉。

enum Stuff { 
    case FloatyThing(Float) 
    case BoolyThing(Bool) 
} 

let objects = ["yes!" : Stuff.BoolyThing(true), 
       "number" : Stuff.FloatyThing(1.0)] 

這會捕獲「一個浮點或布爾對象」,並提供更好的文檔和類型安全性。

卸載數據,使用switch語句:

if let something = objects["yes!"] { 
    switch something { 
    case .FloatyThing(let f): println("I'm a float!", f) 
    case .BoolyThing(let b): println("Am I true?", b) 
    } 
} 

使用switch語句確保您覆蓋所有可能的類型和防止意外卸載數據錯誤的類型。很不錯,編譯器可以幫助你很多。

有關更多信息,請參閱Swift編程語言中的「枚舉和結構」。

我也推薦Alexandros Salazar的Error Handling in Swift,這是一個非常好的例子,它可以用來解決常見的問題。

+3

+1:非常快速。 – Jesper

+0

你如何確定該值是什麼類型,或者打開該值? – Nick

+1

更新了一些更多的背景。這是Swift中非常強大的功能,我希望它很常見。 –