2017-02-25 6 views
3

動的辞書をループする関数をSwiftで作成しましたが、値が辞書型かどうかをチェックしようとすると型の比較条件は常に失敗します。ヒントとして警告を次値の型がチェックされているかどうかチェックする方法<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から始まる連続する一連のシーケンスを、それを呼び出すシーケンスの要素と対にして作成します。それはあなたが望むものではありません。指定した辞書のキーと値のペアを繰り返し処理したいだけです。したがって、.enumerated()を削除して、辞書を直接反復処理してください。

またvalが静的​​(そうでなければ、バックreadNode(node:level:)にそれを渡すことができなくなります)成功のブランチに[String : Any]として入力することができ、条件付きのタイプキャストではなく、単純なisチェックを採用したいと思います。

// ... 

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

ハミッシュに感謝します。問題は.enumeratedです。私はSwiftを学ぶためにこのコードをエクササイズとして書きました。私は列挙されたメソッドなしで辞書インデックスにアクセスできることを知らなかった。アップルのマニュアルでは、「各項目の整数インデックスとその値が必要な場合は、enumerated()メソッドを使用して配列全体を反復処理します。配列内の各項目について、 ()」と表示されます。私はDictionaryが配列ではないことを知っていますが、このメソッドはDictionary型にも存在することがわかりました。 –

+0

@JuanLagoコレクションのインデックスを扱うのは誤って 'enumerated()'と誤解されています.0からの単純な 'Int'カウンタしか扱っていません。' Array'の場合、索引とうまく組み合わせることができますが、これは他のコレクションの場合はほとんどありません。 'Dictionary'は' Element'型の '(Key、Value)'を持っています(反復時にキーと値の両方にアクセスすることができます)。これは、 'Key'を添字にすることができるという事実と結びついて、実際の' Index'型( 'Key'btwとはまったく無関係です)を使う必要はめったにありません。 – Hamish

+0

説明をもう一度ありがとう。この小さな細部をよりよく知るためには、私はスウィフトをもっと深く勉強しなければならないようです。あなたは私にスウィフトに関するいくつかの本をお勧めできますか? –

関連する問題