意外无检查结果的可选值在字典中
我注意到一个行为,当我检查一个字典中的值是否为零时,我觉得很困惑。在某个通知的通知处理程序中,我想检查错误键的值是否为零。虽然尝试调试这个我试过如下:意外无检查结果的可选值在字典中
宝用户信息[ “错误”]
▿可选 - 一些:无
(LLDB)PO USERINFO [ “错误”] ==零
假
鉴于输出的第一个命令,我预计第二返回true。任何想法?
谢谢
我想我已经找到了罪魁祸首。我创建字典如下:
let userInfo = [DatabaseRestaurantNotificationPayload.infoDictionaryErrorKey:nil, DatabaseRestaurantNotificationPayload.infoDictionaryRestaurantKey: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)
嘿亚历克斯,打印时你必须把它当作任何东西吗?我认为它应该默认为'nil'。 –
@AhmadF这是没有必要的,但雨燕编译器警告您,当您试图强迫任何'?''到Any',这通常是一个代码味道。你在说什么'default'? – Alexander
我的意思是,不需要它铸造'Any'的结果应该是“可选(无)”,但正如你所说,编译器会拍一个警告... –
我认为这不是零。但要确认,你能检查'po userInfo [“error”]!'的输出是什么。 (强力解开) – Tushar