2017-02-25 72 views
3

我在Swift中創建了一個循環動態字典的函數,但是當我嘗試檢查值是否爲字典型時,類型比較條件總是失敗,實際上XCode引發了以下警告作爲提示:如何檢查值類型是否字典<String, Any>

Cast from '(key: String, value: Any)' to unrelated type 'Dictionary<String, Any>' always fails. 

我不想轉換任何值,我只是想檢查變量值是否有類型字典。

這是我的代碼:

func readNode(node: Dictionary<String, Any>, level: Int) 
    { 

     // Print spaces 
     for _ in 0 ... level 
     { 
      print(" ") 
     } 


     for (key, val) in node.enumerated() 
     { 

      // The following condition is always false (here is the issue)     
      if val is Dictionary<String, Any> { 
       print("Key \(key):") 
       readNode(node: val, level: (level + 1) * 2) 
      } 
      else 
      { 
       print("Key \(key): \(val)") 
      } 

     } 

    } 

    var mydict = Dictionary<String, Any>() 

    mydict = ["subindex2": 2, "subindex3": 3, "subindex4": ["whatever": "extra"]] 

    readNode(node: mydict, level: 0) 

我使用斯威夫特3.0.1。

+0

你爲什麼在'node'參數上使用枚舉? –

回答

3

enumerated()創建從0開始的連續Int的序列,並與您調用序列的元素配對。這不是你想要的 - 你只是想遍歷給定字典的鍵值對。所以只要刪除.enumerated(),並直接迭代字典。

你還需要使用條件的類型轉換,而不是一個簡單的is檢查,允許val在成功分行靜態類型爲[String : Any](否則你將無法通過它放回readNode(node:level:))。

// ... 

for (key, val) in node { 
    if let val = val as? [String : Any] { 
     print("Key \(key):") 
     readNode(node: val, level: (level + 1) * 2) 
    } else { 
     print("Key \(key): \(val)") 
    } 
} 

// ... 
+0

感謝Hamish,所以問題出現在.enumerated。爲了學習Swift,我編寫了這段代碼作爲練習。我不知道如果沒有枚舉方法,我可以訪問字典索引。它有點困惑,因爲蘋果手冊說:「如果你需要每個項目的整數索引以及它的值,使用enumerated()方法遍歷數組。對於數組中的每個項目,枚舉()」。我知道一個字典不是一個數組,但是我發現這個方法也適用於Dictionary類型。 –

+0

@JuanLago這是一個關於'enumerated()'的錯誤概念,它處理一個集合的索引 - 它只處理一個簡單的來自0的'Int'計數器。對於'Array',這只是*發生*對齊很好的與指數,但這是其他收藏很少情況下。 '無論如何,'Dictionary'都有一個'Element'類型的'(Key,Value)'(允許您在迭代時訪問鍵和值)。這與你可以用'Key'給它下標的事實相結合,這意味着你很少需要使用它實際的'Index'類型(它與'Key' btw完全無關)。 – Hamish

+0

再次感謝您的解釋。似乎我必須深入研究Swift,以便更好地瞭解這些小細節。你能推薦我一些關於Swift的書嗎? –

相關問題