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

问题描述:

我注意到一个行为,当我检查一个字典中的值是否为零时,我觉得很困惑。在某个通知的通知处理程序中,我想检查错误键的值是否为零。虽然尝试调试这个我试过如下:意外无检查结果的可选值在字典中

宝用户信息[ “错误”]

▿可选 - 一些:无

(LLDB)PO USERINFO [ “错误”] ==零

鉴于输出的第一个命令,我预计第二返回true。任何想法?

谢谢

+0

我认为这不是零。但要确认,你能检查'po userInfo [“error”]!'的输出是什么。 (强力解开) – Tushar

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

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

不像人们可能想到这最终实际添加一个可选的错误键,以便查询字典的errorKey返回可选(零),而不是零本身。

你知道任何可以包含任何东西,对吧?它也可以包含一个可选项。它可以包含一个为零的可选项。

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

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) 
+0

嘿亚历克斯,打印时你必须把它当作任何东西吗?我认为它应该默认为'nil'。 –

+0

@AhmadF这是没有必要的,但雨燕编译器警告您,当您试图强迫任何'?''到Any',这通常是一个代码味道。你在说什么'default'? – Alexander

+0

我的意思是,不需要它铸造'Any'的结果应该是“可选(无)”,但正如你所说,编译器会拍一个警告... –