我目前正在学习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)")
答案 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]
都会返回nil
,monster
将等于"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