字符串不能转换为DictionaryIndex <String,Any>

Tom*_*ley 6 dictionary swift

我正在使用Swift中的字典,它需要保存不同类型的值,尽管键几乎都是字符串.使用Objective-C这很容易,但Swift通常非常有用的类型安全性似乎使这更加困难.

我一直在使用[String:AnyObject]字典,直到我遇到无法将生成的AnyObject向下转换为Swift字符串,这在技术上不是对象而是值类型.我可以通过它来实现和平,因为它似乎有意义,虽然如果有一种解决方法(除了恢复到我不想做的NSString对象),我想知道它.

上面的逻辑解决方案似乎是切换到使用[String: Any]字典,但这样做,即使使用基本的代码,我也发现了一个问题:

func abc() {
    var dict : [String: Any] = [String: Any]()
    if dict["success"] != nil {
       ...
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的第3行代码给出了错误:

'String'不能转换为'DictionaryIndex <String,Any>'.

现在我好像有一个字典,其中包含我怀疑我可以根据需要转发的类型,但是它的密钥似乎不再可以访问,据我所知,它的类型恰好是正确的类型(实际上,虽然它是一个字面意思,甚至错误都表明我传递了一个字符串).我错过了什么,因为我实际上想要实现的是具有多种类型的易于访问的值的字典,我可以在var/let正确的Swift类型中实际检索?

jtb*_*des 5

这里的问题似乎是你的用法Any.Dictionary有两个下标方法:

subscript (i: DictionaryIndex<Key, Value>) -> (Key, Value) { get }
subscript (key: Key) -> Value?
Run Code Online (Sandbox Code Playgroud)

编译器错误地假定您想要第一个,然后抱怨String您传入的内容无法转换为DictionaryIndex<Key, Value>.

要避免此问题,您可以:

  • 强制它使用特定的下标访问器: if dict["success"] as Any? != nil ...

  • [String:AnyObject]相反,声明你的字典- 因为元组不是对象.从指南,

    • AnyObject 可以表示任何类类型的实例.

    • Any 除了函数类型之外,它们可以表示任何类型的实例.

如果您认为这是一个错误,您可能希望提交错误.