2014-07-03 31 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 
相關問題