今天看到一个有趣的例子:
var dictionary: [String: String?] = ["key": nil]
dictionary["key"] = nil
乍一看,感觉两行代码赋予dictionary
的值应该是相同的,但其实第一行得到["key": nil]
,而第二行[:]
。
这就涉及到了Dictionary下标(subscript)的使用与Optional的本质问题。Swift Standard Library中关于Dictionary下标语法的注释提到了:
If you assign
nil
as the value for the given key, the dictionary removes that key and its associated value.
那么问题来了,难道就不能使用下标语法赋予一个key nil值吗?
Optional的本质
我们很容易陷入一个误区,拿String类型为例,认为String?
是String
进行了特殊设置的变种。但其实Optional
是一个枚举类型。如果你在任何Swift文件中输入Optional
,然后[⌘ + Click] 点击,你就会看到Optional的定义:
public enum Optional<Wrapped> : ExpressibleByNilLiteral {
case none
case some(Wrapped)
...
}
所以如果想要用下标给字典中的key赋予nil值,使用
dictionary["key"] = Optional<String>.none
//或者
dictionary["key"] = nil as String?
就可以了。