嘿,伙计们我很快就想要解决一些微妙之处。也就是说,在我继续编码之前,我想在这里巩固我的理解。运行此代码后:
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
所以这是真的吗?
答案 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}}