我正在使用Swift中的字典,它们需要保存不同类型的值,尽管键几乎都是字符串。使用Objective-C非常容易,但Swift通常非常有用的类型安全性似乎使这更加困难。
我一直在使用[String:AnyObject]字典,直到我遇到无法将生成的AnyObject向下转换为Swift字符串,这在技术上不是对象而是值类型。虽然如果有办法绕过它(除了恢复到我不想做的NSString对象)之外,我可以和它达成和平,但我想知道它。
上面的逻辑解决方案似乎正在转换为使用[String: Any]
词典,但这样做即使使用基本代码我也会发现问题:
func abc() {
var dict : [String: Any] = [String: Any]()
if dict["success"] != nil {
...
}
}
上面的第3行代码给出了错误:
'String'不能转换为'DictionaryIndex< String,Any>'。
现在我似乎有一个字典,其中包含我怀疑我可以根据需要转发的类型,但是它的密钥似乎不再可以访问,据我所知,它的类型正确(实际上,虽然这是一个文字,但即使是错误也表明我传递了一个字符串)。我错过了什么,因为我实际上想要实现的是具有多种类型的易于访问的值的字典,我可以在var / let正确的Swift类型中实际检索它?
答案 0 :(得分:5)
这里的问题似乎是你对Any
的使用。 Dictionary
有两个下标方法:
subscript (i: DictionaryIndex<Key, Value>) -> (Key, Value) { get }
subscript (key: Key) -> Value?
编译器错误地假设您想要第一个,然后抱怨您传入的String
无法转换为DictionaryIndex<Key, Value>
。
要避免此问题,您可以:
强制它使用特定的下标存取器:if dict["success"] as Any? != nil ...
将字典声明为[String:AnyObject]
- 因为元组不是对象。来自the guide,
- 除了函数类型之外,
AnyObject
可以表示任何类类型的实例。
Any
可以表示任何类型的实例。
如果您认为这是一个错误,您可能希望file a bug。