首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >斯威夫特的类型推理在这里自相矛盾吗?

斯威夫特的类型推理在这里自相矛盾吗?
EN

Stack Overflow用户
提问于 2014-08-24 21:08:30
回答 3查看 191关注 0票数 4

这是我的测试代码:

代码语言:javascript
复制
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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-24 22:04:46

我相信这是个虫子。这里所发生的部分原因是String不是一个对象。如果将第一行更改为:

代码语言:javascript
复制
var myDict: [String: Any] = ["k":"v"]

那一切都很好。因此,考虑到字符串不是对象,将类型为AnyObject?的变量转换为String肯定会产生错误。而且,由于编译器已经确定aAnyObject?类型,所以它应该抱怨将a转换为String

请注意,如果将最后一行更改为:

代码语言:javascript
复制
var c = myDict["k"] as NSString

错误消失了,支持问题是String不是对象这一概念。如果将Int作为数组中的值并尝试将其转换为Int,则会得到相同的抱怨。

更新

所以情节更复杂了。如果您不使用import Foundation或导入导入基金会的内容,则会得到额外的错误。无基金会:

因此很明显,其中一些因素与Strings作为非对象和NSStrings作为对象的双重性质以及在导入Foundation时将Strings用作NSStrings的能力有关。

票数 2
EN

Stack Overflow用户

发布于 2014-08-25 05:04:16

这与Dictionary有两个下标重载有关:

代码语言:javascript
复制
subscript (key: Key) -> Value?
subscript (i: DictionaryIndex<Key, Value>) -> (Key, Value) { get }

第一个是熟悉的键,在这里传递一个键,它为您提供一个可选的值;您可以使用它来设置一个键的值。

第二种情况不太常见。我相信DictionaryIndex是字典中的一种迭代器,您可以使用它作为下标,直接获得迭代器的键值对。

当编译器找不到匹配的重载(在本例中,第一个不匹配,因为它返回一个不能转换为非可选String的可选的)时,它只是选择一个任意的(嗯,无论如何,它似乎是任意的)显示在错误中。在这个地方,它选择第二个,你不认识。这就是为什么你觉得这个错误很奇怪。

票数 1
EN

Stack Overflow用户

发布于 2014-08-24 21:46:55

这个很管用。

代码语言:javascript
复制
var c = myDict["k"] as AnyObject! as String   // "v"

要回答你的问题,斯威夫特抱怨的原因可能是你试图一次完成这两个转换。记住,var a = myDict["k"]语句已经包含一个隐式转换。隐含的转换是AnyObject?,所以上面的工作方式也是这样的:

代码语言:javascript
复制
var c = myDict["k"] as AnyObject? as String   // "v"

请注意,如果键"k"未定义,上述操作将导致运行时错误。您将允许它通过转换为nil返回String?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25476354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档