我正在尝试创建一个字典变量,其值是两种类型之一。我的尝试的一个例子应该使这一点更清楚:
var objects: <T where T: Float, T: Bool>[String: T]
这引发了仅语法功能类型可以通用的编译器错误。我想知道是否有可能,我只是不知道正确的语法?
为此所需的工具是带有关联数据的枚举。
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撰写的Swift中的错误处理,作为一个很好的示例来说明如何使用它来处理常见问题。