可选出现在结果中

时间:2015-04-01 20:59:34

标签: swift optional

我目前正在学习swift,我编写了以下愚蠢的代码但结果显示如下:"当英雄处于2级"时,怪物是可选的(#34; 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)")

2 个答案:

答案 0 :(得分: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 - 合并运算符(??):

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",并且每次都会打印消息(并且永远不会打印{{1}用它)。

答案 1 :(得分:-1)

假设您的值数组由方框而不是值表示。你怎么可能知道任何一个盒子是否包含实际的东西,即一个值,还是没有?你必须打开和打开 - 因为它是一个精美的包装:) - 知道那里是否有东西的盒子。好吧,Optional就是为了这个目的。

如果您想要摆脱框并使用值,则应使用?!

打开可选项

在您的特定情况下,您可以添加额外的检查以仅在展开的值与nil不同时打印出该消息,或者您可以使用!并寻求不太安全的解决方案:{{1因此,如果解包的值为print("The monster is \(monster!) when the hero is at level \(level)"),则会引发运行时异常。

我注意到nhgrif没有指出,如果不在代码中添加nil分支,也可以执行print("The monster is \(monster?) when the hero is at level \(level)")。这样做,你基本上会得到与使用Objective C

时相同的行为