String不可转换为DictionaryIndex <string,any =“”> </string,>

时间:2014-08-12 19:48:06

标签: 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 {
       ...
    }
}

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

  

'String'不能转换为'DictionaryIndex&lt; String,Any&gt;'。

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

1 个答案:

答案 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