【问题标题】:String is not Convertible to DictionaryIndex<String, Any>字符串不可转换为 DictionaryIndex<String, Any>
【发布时间】:2014-08-12 19:48:06
【问题描述】:

我正在使用 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'。

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

【问题讨论】:

    标签: dictionary swift


    【解决方案1】:

    这里的问题似乎是您使用了AnyDictionary 有两个下标方法:

    subscript (i: DictionaryIndex<Key, Value>) -> (Key, Value) { get }
    subscript (key: Key) -> Value?
    

    编译器错误地假定您想要第一个,然后抱怨您传入的​​String 无法转换为DictionaryIndex&lt;Key, Value&gt;

    为避免此问题,您可以:

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

    • 改为将您的字典声明为[String:AnyObject]——因为元组不是对象。来自the guide

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

      • Any 可以表示任何类型的实例,除了函数类型。

    如果您认为这是一个错误,您不妨file a bug

    【讨论】:

    • 很好的回答,谢谢,还有演员吗?似乎达到了我想要的。我不确定它是否假设第一个访问器是错误的,因为我并不真正了解它的预期用途。我需要再读一遍我认为的指南。再次感谢!
    • 但是当您有多层嵌套字典时,它是如何工作的呢?我遇到了同样的错误,但我的行看起来更像:dict["bug"]["spotted"]["red"]++(最里面的dict是String:Int,其余的都是String:Any。Any帮助将不胜感激!
    • 我想我在问我会在哪里插入'as Any?'在我的代码行中: bugs["ladybug"]as Any?["spotted"]as Any?["red"]As Int?++ 这似乎对我不起作用:(
    • 是的,当提供一个满足两个函数声明之一的对象并且编译器选择一个不能满足的对象时,这绝对是一个错误。有人提交了吗?如果是这样,请发布雷达编号。如果没有,我有时间就去。
    猜你喜欢
    • 2017-04-14
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多