为何[String: String]字典设nil合法?两类字典设nil的差异
为什么非可选值字典设置nil也能运行?和可选值字典的差异解析
这个问题问得特别到位!我刚接触Swift字典的时候也被这个“看似矛盾”的特性搞懵过,咱们把这两种字典的行为拆解开说清楚。
先看你写的非可选值字典 [String: String]
你声明的是值类型为非可选String的字典,但执行dict["key"] = nil时并没有报错,反而能正常运行——这是因为Swift对这个语法做了特殊设计:
对于非可选值类型的字典,
dict[key] = nil并不是给key赋值nil(毕竟非可选值不能为nil),而是直接删除这个key对应的整个条目。
当你后续执行let value = dict["key"]时,拿到的value是String?类型,这不是因为字典的值是可选的,而是因为字典的subscript(下标)本身返回可选值:如果key存在就返回对应的值(包装成可选型),如果key不存在就返回nil。
举个实际的代码例子更清楚:
var dict = [String: String]() dict["key"] = "Swift" print(dict) // 输出:["key": "Swift"] dict["key"] = nil print(dict) // 输出:[:] —— 整个key被删掉了,字典变空 let value = dict["key"] // value 是 String? 类型,值为 nil(因为key不存在)
再对比可选值字典 [String: String?]
如果是值类型为可选String?的字典,dict["key"] = nil的行为就完全不一样了:
对于可选值类型的字典,
dict[key] = nil是真的给这个key设置了一个nil值,而字典里的这个key依然存在。
这时候你取值的时候,拿到的是双重可选类型String??——第一层可选表示key是否存在,第二层可选表示对应的值是否为nil。
同样看代码例子:
var dict = [String: String?]() dict["key"] = "Swift" print(dict) // 输出:["key": Optional("Swift")] dict["key"] = nil print(dict) // 输出:["key": nil] —— key还在,只是值被设为nil let value = dict["key"] // value 是 String?? 类型,值为 Optional(nil)(key存在,但值为nil)
核心差异总结
- 非可选值字典(
[Key: Value]):dict[key] = nil→ 删除该key的条目- 取值返回
Value?(可选型表示key是否存在)
- 可选值字典(
[Key: Value?]):dict[key] = nil→ 为该key设置nil值,key保留- 取值返回
Value??(双重可选,第一层表示key是否存在,第二层表示值是否为nil)
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

