字典值自动是可选的吗?

时间:2017-02-25 00:54:13

标签: swift dictionary

嘿,伙计们我很快就想要解决一些微妙之处。也就是说,在我继续编码之前,我想在这里巩固我的理解。运行此代码后:

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所以这是真的吗?

2 个答案:

答案 0 :(得分:0)

如果未设置密钥,字典通常会返回nil。你没有添加没有值的键,你只是读了两次未设置键,因此两次都返回nil(一次无效,第二次打印)。

答案 1 :(得分:0)

你有两个完全不同的问题。在第二个代码中,您永远不会为密钥print分配值,这就是nil语句显示content["blade"] 的原因。

该行:

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

不添加任何内容。它实际上试图访问该密钥的值。

第一位代码的问题仅仅是因为任何字典查找的值都是可选值,因为在运行时不能保证给定键的值是存在的。

您可以通过执行以下操作来修复代码:

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

但不要这样做。相反,安全地做到:

{{1}}