2017-02-25 30 views
0

嗨進出口新的快捷,試圖找出一些微妙之處。也就是說,在我繼續編碼之前,我想在這裏鞏固我的理解。字典值是否可自動選擇?

var content:[String:Double] = [:] 
content["swords"] = 12 
content["bows"] = 113 
content["swords"] = content["swords"] + 12 // problem line 

我得到如下:

error: value of optional type 'Double?' not unwrapped;

這是否意味着,在字典中的每個值是一個可選的這段代碼運行之後?我想如果這是真的,那麼我可以添加一個沒有價值的密鑰並打印出來。

var content:[String:Double] = [:] 
content["swords"] = 12 
content["bows"] = 113 
content["blade"] 
print(content["blade"]) 

它確實打印了nil所以這是真的嗎?

回答

0

你有兩個完全不同的問題。在你的第二個代碼,你永遠不分配一個值的關鍵"blade"這就是爲什麼print聲明顯示nil

行:

content["blade"] 

不添加任何東西。它實際上試圖訪問該鍵上的值。

與代碼的第一位的問題很簡單,因爲任何字典查找的值是一個可選的值,因爲在運行時也不能保證有一個給定鍵的值。

您可以通過執行修復代碼:

content["swords"] = content["swords"]! + 12 

但不這樣做。相反,請安全地執行此操作:

if let swords = content["swords"] as? Double { 
    content["swords"] = swords + 12 
} 
0

字典通常會返回零如果密鑰未設置。你沒有添加一個沒有值的密鑰,你只需要讀取一個未設置的密鑰兩次,因此兩次都返回nil(一次無所事事,第二次打印)。

+0

但它們確實存在的值是可選項,對不對? – Obito

+0

由於這是讓你知道,你應該檢查未定義鍵雨燕的方式 - 是的,他們是。 – Compufreak