Swift只允许字典包含单个类型 .
这是Swift书中的定义:
字典是一个存储多个相同类型值的容器[...]它们与Objective-C的NSDictionary和NSMutableDictionary类不同,后者可以使用任何类型的对象作为其键和值,并且不提供有关这些物体的本质 .
如果是这样,那么我们将如何创建嵌套字典?
想象一下,我们有一个 plist
,它包含String,Array和Dictionary项目 . 如果我只允许持有相同类型的项目(字符串,数组等),那么我将如何使用存储在plist中的不同类型的项目?
如何在Swift中的同一个字典中放入不同的类型?
7 回答
您可以使用
Any
类型实现类似plist的嵌套结构,用于字典值,即Swift 's somewhat counterpart to Objective-C' sid
类型,但也可以保存值类型 .编辑:
Any
似乎比AnyObject
好,因为在上面的代码中response["status"]
的类型为Swift.Int
,而使用AnyObject
的值类型则为__NSCFNumber
.正如已经建议的那样,你可以使用
Any
类型来表示一个真正凌乱的plist字典's values. But then how do you work with the data? Cast every value any time you look it up from the dictionary? That' . 一个更好,更类型安全的方法来模拟一个plist将是利用Swift 's enums, also known as algebraic data types or discriminated unions. They let you specify exactly what types are permitted in the dictionary and avoid ever having to cast. Here'的一个实现,解释说:在最原子级别,只有上述数据类型可以存储在plist中 . plist中的每个'node'最终只能是这些类型中的一种 . 所以我们创建一个枚举,让我们指定它 .
plist基本上是键值对的字典,每个值可以是原子(即非集合)值;或者它可以是一个原子值数组;或者它可以是字符串 - plist值对的字典 . 上面的枚举表达了这些约束,而typealias为plist类型提供了一个易于记忆的名称 .
鉴于上述类型,我们可以以类型安全的方式完全表达任何给定的plist,例如:
这里的类型安全意味着您可以使用
switch
语句处理任何给定的plist并覆盖所有可能性而无需任何转换 . 您正在消除一大类潜在的运行时错误 . 例如 . :请注意,有必要将递归数据结构包装在“框”(指向实际值的指针)中,以保持其大小有限 .
NSObject适用于我的情况,而“Any”则不适用
使用:Dictionary <String,AnyObject>
像这样使用NSMutableDictionary:
希望这会好起来的 .
NSMutableDictionary to Dictionary works like a charm and will allow you to put different types in a Dictionary in the Swift Language:
可以指定限制字典的类型