字典中可选值的意外nil检查结果

时间:2017-10-15 17:55:24

标签: swift cocoa

我注意到在查看字典中的值是否为零时,我发现一种令人困惑的行为。在某个通知的通知处理程序中,我想检查错误键的值是否为nil。在尝试调试时,我尝试了以下内容:

  

po userInfo ["错误"]

     

▿可选     - 有些:没有了

     

(lldb)po userInfo [" error"] == nil

     

鉴于第一个命令的输出,我预计第二个命令将返回true。有什么想法吗?

由于

3 个答案:

答案 0 :(得分:2)

userInfo["error"]正在回馈Optional<Sometype>.some(Optional<SomeOtherType>.none)。因此,userInfo词典 具有键"error"的值,但该值是另一个可选的,其本身为nil

这是一个模仿结构的代码片段:

let userInfo: [String: String?] = [
    "something": "something else",
    "another thing": "yet another thing",
    "error": nil
]

print(userInfo["error"] as Any) // Optional(nil)

答案 1 :(得分:0)

你知道Any可以包含任何内容,对吗?它还可以包含一个可选项。它可以包含一个nil的可选项。

看起来这就是这里发生的事情。 userInfo [“error”]不是nil,它包含一个值为nil的可选项。那不是一回事。我会检查你是如何创建userInfo的。

答案 2 :(得分:0)

我想我找到了罪魁祸首。我正在创建字典如下:

let userInfo = [DatabaseRestaurantNotificationPayload.infoDictionaryErrorKe‌​y:nil, DatabaseRestaurantNotificationPayload.infoDictionaryRestaura‌​ntKey:value1] as [String : Any]

并且与人们可能期望的不同,这最终实际上为错误键添加了一个可选项,因此查询字典以获取errorKey会返回Optional(nil)而不是nil本身。