Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
字符串不能转换为DictionaryIndex<;字符串,任意>;_Dictionary_Swift - Fatal编程技术网

字符串不能转换为DictionaryIndex<;字符串,任意>;

字符串不能转换为DictionaryIndex<;字符串,任意>;,dictionary,swift,Dictionary,Swift,我正在使用Swift中的字典,它需要保存不同类型的值,尽管键几乎都是字符串。这对于Objective-C来说非常容易,但Swift通常非常有用的类型安全性似乎使这变得更加困难 我一直在使用[String:AnyObject]字典,直到我遇到无法将结果AnyObject向下转换为Swift字符串的情况,从技术上讲,Swift字符串不是对象,而是值类型。我可以平静地对待它,因为它似乎是有意义的,尽管如果有办法解决它(除了恢复到我不想做的NSString对象之外),我想知道它 上面的逻辑解决方案似乎是

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

我一直在使用[String:AnyObject]字典,直到我遇到无法将结果AnyObject向下转换为Swift字符串的情况,从技术上讲,Swift字符串不是对象,而是值类型。我可以平静地对待它,因为它似乎是有意义的,尽管如果有办法解决它(除了恢复到我不想做的NSString对象之外),我想知道它

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

func abc() {
    var dict : [String: Any] = [String: Any]()
    if dict["success"] != nil {
       ...
    }
}
上面第三行代码给出了错误:

“字符串”不能转换为“DictionaryIndex”


现在我似乎有一个字典,其中包含我怀疑可以按需要向下转换的类型,但它的键似乎不再可以访问,据我所知,这些键的类型完全正确(事实上,尽管它是一个文本,甚至错误表明我在传递字符串)。考虑到我真正想要实现的是具有多种类型的易于访问的值的字典,而我实际上可以在正确的Swift类型的var/let中检索这些值,我缺少的是什么?

这里的问题似乎是您对
Any
的使用<代码>字典有两种下标方法:

subscript (i: DictionaryIndex<Key, Value>) -> (Key, Value) { get }
subscript (key: Key) -> Value?
下标(i:DictionaryIndex)->(键,值){get}
下标(键:键)->值?
编译器错误地假设您想要第一个,然后抱怨您传入的
字符串
无法转换为
字典索引

要避免此问题,您可以:

  • 强制它使用特定的下标访问器:
    if dict[“success”]as Any无…

  • 将字典声明为
    [String:AnyObject]
    ——因为元组不是对象。从

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

    • Any
      可以表示除函数类型之外的任何类型的实例


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

回答得很好,谢谢,演员阵容如何?似乎达到了我想要的。我不确定它是否假设第一个访问器是错误的,因为我不太了解它的预期用途。我想我需要再读一读这本指南。再次感谢!但是,当您有多层嵌套字典时,这是如何工作的呢?我得到了同样的错误,但我的代码行看起来更像:dict[“bug”][“spotted”][“red”]+(最里面的dict是String:Int,其余的都是String:Any。任何帮助都将不胜感激!我想我是在问我的代码行:bug[“ladybug”]as Any?[“spotted”]as Any?[“red”]作为Int?++,这似乎对我不起作用:(是的,当提供一个满足两个函数声明中的一个的对象时,编译器选择一个不能满足的,这肯定是一个bug。有人提交了吗?如果有,请发布雷达号。如果没有,我会在有时间的时候开始。