今天看到一個(gè)有趣的例子:
var dictionary: [String: String?] = ["key": nil]
dictionary["key"] = nil
乍一看,感覺(jué)兩行代碼賦予dictionary
的值應(yīng)該是相同的壁熄,但其實(shí)第一行得到["key": nil]
块仆,而第二行[:]
闻坚。
這就涉及到了Dictionary下標(biāo)(subscript)的使用與Optional的本質(zhì)問(wèn)題偎捎。Swift Standard Library中關(guān)于Dictionary下標(biāo)語(yǔ)法的注釋提到了:
If you assign
nil
as the value for the given key, the dictionary removes that key and its associated value.
那么問(wèn)題來(lái)了啤咽,難道就不能使用下標(biāo)語(yǔ)法賦予一個(gè)key nil值嗎?
Optional的本質(zhì)
我們很容易陷入一個(gè)誤區(qū)廓奕,拿String類型為例,認(rèn)為String?
是String
進(jìn)行了特殊設(shè)置的變種档叔。但其實(shí)Optional
是一個(gè)枚舉類型桌粉。如果你在任何Swift文件中輸入Optional
,然后[? + Click] 點(diǎn)擊衙四,你就會(huì)看到Optional的定義:
public enum Optional<Wrapped> : ExpressibleByNilLiteral {
case none
case some(Wrapped)
...
}
所以如果想要用下標(biāo)給字典中的key賦予nil值铃肯,使用
dictionary["key"] = Optional<String>.none
//或者
dictionary["key"] = nil as String?
就可以了。