I'm quite confused:
Let's create a dictionary:
var d = ["foo": nil] as [String: Any?]
Now if I want to remove the key "foo", I can just do
d["foo"] = nil // d is now [:]
And other option could be:
let x: String? = nil
d["foo"] = x // d is now [:]
But this behaves differently:
let x: Any? = nil
d["foo"] = x // d is still ["foo": nil]
Similarly to the above (which I think is the same):
d["foo"] = d["foo"] // d is still ["foo": nil]
What is going on? And btw, why does swift let us delete keys with setting them to nil, instead sticking with
d.removeValue(forKey: "foo")
?
/// If you assign `nil` as the value for the given key, the dictionary
/// removes that key and its associated value.
This is a sentence from the documentation, so as you can see it is by design. If this not fit your needs then you are doomed to use updateValue(value: Value, forKey: Hashable) which also works more predictable.
What I found is that when you use NSMutableDictionary instead of Dictionary then it works as "expected"
let ns = NSMutableDictionary(dictionary: d)
let x: Any? = nil
ns["foo"] = x // ns {}
However let x = Any? = nil case seems that there is a bug in Swift implementation at least to version Apple Swift version 3.0.1 (swiftlang-800.0.58.6 clang-800.0.42.1)
Btw. when all elements from Dictionary are removed, type of Dictionary is still correctly recognised
let x: String? = nil
d["foo"] = x // d is now [:]
let m = Mirror(reflecting: d) // Mirror for Dictionary<String, Optional<Any>>
I allowed myself to add bug to Swift lang: https://bugs.swift.org/browse/SR-3286
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With