为什么我无法访问此Swift词典中的项目?

时间:2014-07-03 23:16:37

标签: swift

var foo: Dictionary<String, AnyObject>[] = [["grapes": 10, "blueberries": "twelve"], ["carrots": "fifteen"]]

// Works
var bar = foo[0]["grapes"]! as Int // Works

var dict = foo[0]

// Compiler error
var grapesValue = dict["grapes"]! as Int

我创建了一个Dictionary<String, AnyObject>变量数组。

如果我访问数组项,然后是字典项,它可以正常工作。但如果我将它们分成变量,我就不能。我收到这个错误:

  

使用'as'向下转换为'Int'

我做错了什么?

3 个答案:

答案 0 :(得分:1)

这真奇怪!

在这种情况下的一些解决方法包括:

var grapesValue = dict["grapes"] as NSNumber

-OR -

var grapesValue = dict["grapes"]?.integerValue

答案 1 :(得分:0)

不确定是编译器错误还是语言缺陷,但这是一种解决方法

 19> var grapesValue = dict["grapes"] as NSNumber as Int
grapesValue: Int = 10

答案 2 :(得分:0)

你有基金会进口吗?如果你这样做,斯威夫特有时会开始做一些假设。删除导入有助于解决其中的一些问题。从第一行开始。

var foo: Dictionary<String, AnyObject>[] = [["grapes": 10, "blueberries": "twelve"], ["carrots": "fifteen"]]

没有基金会,斯威夫特在这条线上窒息。 Swift Dictionaries不符合AnyObject协议,因为它们是类。如果基础类可用,swift假定您的意思是NSDictionary并使用它。

我们可以通过将AnyObject更改为Any来让它在没有Foundation的情况下工作。现在我们可以正常使用所有这些代码:

var bar = foo[0]["grapes"] as Int

var dict = foo[0] as Dictionary<String, Any>

var grapesValue = dict["grapes"] as Int

我在dict上添加了一个演员,并删除了!下标后。 NSDictionary返回一个隐式解包的可选项,但是使用Dictionary,我们知道我们会得到一些东西。

所有这些代码都适用于导入的Foundation,但是为了找出Swift正在做出什么假设以及如何修复它们,删除它会很有帮助。

您可能需要查看帮助我的article

编辑:你在演员表上得到错误的原因是因为NSDictionary只能存储AnyObjects,所以它必须使用NSNumber而不是Int。如果你导入了Foundation,Swift也会来回翻译它们。虽然在这种情况下由于某种原因它无法弄清楚最后一行。 Bryan和fqdn建议的解决方法似乎能够强迫Swift理解。这个也对我有用:

var dict = foo[0] as NSDictionary
var grapesValue = dict["grapes"] as Int