2015-09-06 44 views
2

我有以下字典可選結合解開不字典

var menuItems: [[String: String?]] = [ 
    ["name": "Home", "identifier": "homeController"], 
    ["name": "Page 2", "identifier": "page2"], 
    ["name": "Page 3", "identifier": "page3"]] 

現在我翻翻字典,使用下面的代碼

var names: [String] = [String]() 
for item in menuItems 
{ 
    if let name = item["name"] 
    { 
     names.append(name) 
    } 
} 

if let name = item["name"]應該拆開包裝和名稱分配給循環name不變。指定作品但展開不會發生。

names.append(name)拋出異常Value of optional type 'String?' not unwrapped; did you mean to use '!' or '?'?

爲什麼不item["name"]得到解開?

+0

下標是否已經返回一個可選值?!所以你要返回類似'String ??'而不是'String?'。 – DevAndArtist

+0

@DevAndArtist I [見](http://i.imgur.com/4CyZFMm.png)。謝謝! – Pepijn

+1

這可以用'if let value = item [「name」],name = value'解開。 – vacawama

回答

1

item["name"]做得到解開。它被解包到String?。請記住,字典總是返回一個可選值(對於給定鍵不存在值的情況)。

在你的情況下,值IS另一個可選的字符串類型。

如果你的字典裏被宣佈爲[String: String](無?該值類型),那麼你就不會去拆開包裝與!

+0

不知道'item [「name」]'解開了,謝謝! – Pepijn

2

從giorashc答案是正確的,但我想我會發布此,因爲它可能值幫助某人理解這個原因。

使用泛型參數KV定義字典。

所以對於一個給定字典dict : [K:V]

dict[k]輸出是V?類型。

在這種情況下K = StringV = String?

因此下標訪問結果的類型是String??。正如已經指出的那樣打開到String?