2015-04-01 57 views
2

我目前正在學習swift,我寫了下面的愚蠢代碼,但結果顯示如下:「當英雄處於2級時,怪物是可選的(」sihso「)。我不知道爲什麼在那裏有可選的詞。可選出現在結果中

var level = 2 
var mons = [1 : "SHhi", 2 : "sihso", 3 : "shssh"] 
var monster = mons [level] 
print("The monster is \(monster)" + " when the hero is at level \(level)") 

回答

7

Optional是那裏,因爲monster有隱式類型String?,一個可選的字符串。

當在特定的鍵上查詢字典的值時,它們返回可選類型。給定密鑰的值可能存在也可能不存在。如果不存在,則返回nil

所以,我們必須檢查確定我們有價值。

let level = 2 
let mons = [1 : "SHhi", 2 : "sihso", 3 : "shssh"] 
if let monster = mons[level] { 
    print("The monster is \(monster) when the hero is at level \(level)") 
} 

作爲一個說明,如果mons沒有爲我們通過它的鍵的值,沒有什麼會停止打印(這是最有可能我們想要的)。

如果我們想打印無論哪種方式,最好的辦法可能是使用nil -coalescing運營商(??):

let level = 2 
let mons = [1 : "SHhi", 2 : "sihso", 3 : "shssh"] 
var monster = mons[level] ?? "unknown" 
print("The monster is \(monster) when the hero is at level \(level)") 

現在,任何時候mons[level]將返回nilmonster反而等於"unknown",並且消息將每次打印(並且從不打印Optional())。

-1

假設您的數組值由box而不是值來表示。你怎麼可能知道任何盒子是否包含實際的東西,即一個值,或者不是?你必須打開和打開 - 因爲它是一個精美的包裝:) - 知道是否有內容的盒子。那麼,Optional就是爲了達到這個目的。

如果你想獲得真正擺脫箱和使用的值,而不是你應該使用?!

在特定情況下解開可選,您可以添加額外的檢查,以打印出消息,只有當展開的值與零不同,或者您可以使用!並選擇不太安全的解決方案:print("The monster is \(monster!) when the hero is at level \(level)")因此如果展開值爲nil,則會引發運行時異常。

我注意到nhgrif沒有指出,也可以這樣做print("The monster is \(monster?) when the hero is at level \(level)")而不在代碼中添加if分支。這樣做基本上最終會產生與使用Objective C相同的行爲C