Словарь<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)

Другие вопросы по тегам