可选出现在结果中

Optional Appears in the result

我目前正在学习swift,我写了以下愚蠢的代码,但结果显示如下:"The monster is Optional("sihso") when the hero is at level 2"。我不知道为什么那里有可选这个词。

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)")

单词 Optional 在那里是因为 monster 具有隐式类型 String?,一个可选的字符串。

当查询字典中特定键的值时,它们 return 是可选类型。给定键可能存在也可能不存在值。如果不存在,则 returns 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)")
}

请注意,if mons 没有我们传递给它的密钥的值,根本不会打印任何内容(这很可能是我们想要)。

如果我们想以任何一种方式打印,最好的方法可能是使用 nil-合并运算符 (??):

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] 都会 return nilmonster 将等于 "unknown",并且每次都会打印消息(永远不要用它打印 Optional())。

假设您的值数组由框而不是值表示。你怎么可能知道任何盒子是否真的包含某些东西,即一个值,或者没有?您必须打开并打开包装 - 因为它是一个包装精美的 :) - 盒子才能知道里面是否有东西。好吧,Optional 可以达到这个目的。

如果你真的想摆脱盒子并使用值,你应该使用 ?!

解开 Optional

在您的特定情况下,您可以添加一个额外的检查以仅在展开的值不同于 nil 时打印出该消息,或者您可以使用 ! 并寻求不太安全的解决方案:print("The monster is \(monster!) when the hero is at level \(level)") 因此如果展开的值为 nil.

则引发运行时异常

我注意到 nhgrif 没有指出不在代码中添加 if 分支也可以做到 print("The monster is \(monster?) when the hero is at level \(level)")。这样做基本上最终会产生与使用 Objective C

时相同的行为