2014-07-03 30 views
1
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>变量数组。为什么我无法访问这个Swift字典中的项目?

如果我访问数组项,那么字典项,它工作正常。但是如果我将它们分解成变量,我不能。我得到这个错误:

Use 'as' to downcast to 'Int'

我在做什么错?

+0

你得到什么错误? – jtbandes

+0

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

回答

1

这真是奇怪!

在这种情况下,一对夫妇的解决方法的将包括:

var grapesValue = dict["grapes"] as NSNumber

- 或 -

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

0

不知道它是一个编译器错误或缺陷的语言,但是这是一个解决办法

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

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

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

没有基础,Swift在这条线上扼流圈。 Swift字典不符合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返回一个隐式解包可选,但与一个词典,我们知道我们会得到的东西。

所有这些代码都可以与导入的Foundation一起工作,但为了找出Swift正在做出的假设以及如何解决这些假设,删除它很有帮助。

你可能想看看这article,帮助我。

编辑:您在转换中获取该错误的原因是因为NSDictionary只能存储AnyObjects,所以它必须使用NSNumber而不是Int。如果你有基金会进口,Swift也会来回翻译。虽然在这种情况下,由于某种原因无法弄清楚最后一行。 Bryan和fqdn提出的解决方法似乎能够将Swift强制理解。这一个也适用于我:

var dict = foo[0] as NSDictionary 
var grapesValue = dict["grapes"] as Int 
相关问题