2014-07-14 55 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中非常强大的功能,我希望它很常见。 –