2017-10-15 34 views
1

我注意到一個行爲,當我檢查一個字典中的值是否爲零時,我覺得很困惑。在某個通知的通知處理程序中,我想檢查錯誤鍵的值是否爲零。雖然嘗試調試這個我試過如下:意外無檢查結果的可選值在字典中

寶用戶信息[ 「錯誤」]

▿可選 - 一些:無

(LLDB)PO USERINFO [ 「錯誤」] ==零

鑑於輸出的第一個命令,我預計第二返回true。任何想法?

謝謝

+0

我認爲這不是零。但要確認,你能檢查'po userInfo [「error」]!'的輸出是什麼。 (強力解開) – Tushar

回答

0

我想我已經找到了罪魁禍首。我創建字典如下:

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

不像人們可能想到這最終實際添加一個可選的錯誤鍵,以便查詢字典的errorKey返回可選(零),而不是零本身。

0

你知道任何可以包含任何東西,對吧?它也可以包含一個可選項。它可以包含一個爲零的可選項。

看起來這是這裏發生的事情。 userInfo [「error」]不是零,它包含一個值爲nil的可選項。這不是一回事。我會檢查你是如何創建userInfo的。

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

嘿亞歷克斯,打印時你必須把它當作任何東西嗎?我認爲它應該默認爲'nil'。 –

+0

@AhmadF這是沒有必要的,但雨燕編譯器警告您,當您試圖強迫任何'?''到Any',這通常是一個代碼味道。你在說什麼'default'? – Alexander

+0

我的意思是,不需要它鑄造'Any'的結果應該是「可選(無)」,但正如你所說,編譯器會拍一個警告... –