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'
我做错了什么?
答案 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