Словарь<AnyHashable: Any>, где Any может содержать значение nil в Swift 3
Может кто-нибудь объяснить, почему это работает в Swift 3?
var dict: [AnyHashable: Any]
let b: AnyObject? = nil
let c = b as Any
dict = ["a": "aa", "b": c]
Если я проверю
dict["b"] == nil
Возвращает ложь. Это должно быть правильно?
2 ответа
Предполагая, что вы используете последний Xcode, 8.1 (8B62) с Swift 3.0.1 .
Any
содержащий nil
не так просто, как простой вложенный необязательно:
Вложенный необязательный
var dictWithOptional: [String: AnyObject?] = [
"a": "aa" as NSString,
"b": nil,
]
if let b = dictWithOptional["b"] { //<-check if `dict` contains value for "b"
print(b) //->nil (with compiletime warning)
print(b == nil) //->true
}
b == nil
возвращается true
,
Any
содержащий nil
var dict: [AnyHashable: Any]
let b: AnyObject? = nil
let c = b as Any
dict = ["a": "aa", "b": c]
print(Array(dict.keys)) //->[AnyHashable("b"), AnyHashable("a")]
if let b = dict["b"] { //<-check if `dict` contains value for "b"
print(b) //->nil
print(b == nil) //->false (with compiletime warning)
}
b == nil
становится false
как написано ОП.
Вы можете обнаружить nil
в Any
с чем-то вроде этого:
if let b = dict["b"] { //<-check if `dict` contains value for "B"
if b as AnyObject === NSNull() {
print("b is nil") //->b is nil
}
}
(Это работает в Swift 3.0.1, а не в Swift 3.0.0 .)
Вы сталкиваетесь с вложенными опциями. Если словарь содержит тип E
тогда метод доступа к словарю возвращает значение типа E?
либо значение, если оно существует, либо ноль.
В вашем случае вы создали словарь, в котором значение является необязательным. Итак E
выше что-то вроде Any?
, Это означает, что возвращаемое значение геттера E?
т.е. Any??
В твоем случае, dict["b"]
возвращает не ноль необязательный, содержащий значение "ноль"
Размещение вашего кода на детской площадке и печать dict["b"]
подтверждает это, печатая строку Optional(nil)