这是我的测试代码:
var myDict: [String: AnyObject] = ["k":"v"]
var a = myDict["k"]
var b = a as String
var c = myDict["k"] as String这里是我在Xcode6-beta6的斯威夫特操场:

根据类型推理的规则,不抱怨c在逻辑上是矛盾的--抱怨b
发布于 2014-08-24 22:04:46
我相信这是个虫子。这里所发生的部分原因是String不是一个对象。如果将第一行更改为:
var myDict: [String: Any] = ["k":"v"]那一切都很好。因此,考虑到字符串不是对象,将类型为AnyObject?的变量转换为String肯定会产生错误。而且,由于编译器已经确定a是AnyObject?类型,所以它应该抱怨将a转换为String。
请注意,如果将最后一行更改为:
var c = myDict["k"] as NSString错误消失了,支持问题是String不是对象这一概念。如果将Int作为数组中的值并尝试将其转换为Int,则会得到相同的抱怨。
更新
所以情节更复杂了。如果您不使用import Foundation或导入导入基金会的内容,则会得到额外的错误。无基金会:

因此很明显,其中一些因素与Strings作为非对象和NSStrings作为对象的双重性质以及在导入Foundation时将Strings用作NSStrings的能力有关。
发布于 2014-08-25 05:04:16
这与Dictionary有两个下标重载有关:
subscript (key: Key) -> Value?
subscript (i: DictionaryIndex<Key, Value>) -> (Key, Value) { get }第一个是熟悉的键,在这里传递一个键,它为您提供一个可选的值;您可以使用它来设置一个键的值。
第二种情况不太常见。我相信DictionaryIndex是字典中的一种迭代器,您可以使用它作为下标,直接获得迭代器的键值对。
当编译器找不到匹配的重载(在本例中,第一个不匹配,因为它返回一个不能转换为非可选String的可选的)时,它只是选择一个任意的(嗯,无论如何,它似乎是任意的)显示在错误中。在这个地方,它选择第二个,你不认识。这就是为什么你觉得这个错误很奇怪。
发布于 2014-08-24 21:46:55
这个很管用。
var c = myDict["k"] as AnyObject! as String // "v"要回答你的问题,斯威夫特抱怨的原因可能是你试图一次完成这两个转换。记住,var a = myDict["k"]语句已经包含一个隐式转换。隐含的转换是AnyObject?,所以上面的工作方式也是这样的:
var c = myDict["k"] as AnyObject? as String // "v"请注意,如果键"k"未定义,上述操作将导致运行时错误。您将允许它通过转换为nil返回String?。
https://stackoverflow.com/questions/25476354
复制相似问题