2016-09-15 4 views
0

私たちのサーバー側の開発者は、私に辞書の辞書の辞書の辞書の辞書を持つJSON文字列を教えてくれています。それは本当に楽しいことです。だから、私はいつもそれらをdict [String:AnyObject]にシリアル化しています。オブジェクトをキャストするだけで問題はありませんでした。 :(今日ではありません!私は変換したときにポップアップした他のすべてのエラーを修正しましたが、これは私には意味をなさない、と私は同様の質問を見て、そのコードは私の状況を反映していません。 2年だから多分私は悪い習慣を使用していると誰かが悪い習慣の私を壊すことができるいずれかの方法私はいくつかの助けに感謝しますSwift3にアップデートして以来のサブスクリプションの問題

ここで私の解析機能の少しスニペットですあなたがそれを必要としています。あなたの助けのために再び

func parseRecipes() 
{ 
    if self.avarhub.jsonDICT["recipes"]!.count > 0 
    { 
     for index in 0..<self.avarhub.jsonDICT["recipes"]!.count 
     { 
      self.avarhub.recipe.append(self.avarhub.jsonDICT["recipes"]![index]["recipe"] as! String) //the errors all happen on these lines 
//they say ambiguous reference to member 'subscript' or Type 'Any' has no subscript members 
     } 
    } 
    self.tableviewrecipe.reloadData() 
} 

感謝。

詳しいコード多分これは役立つだろう?

//data struscture my variable hub 
internal struct varhub 
{ 
    //json dictionary 
    var jsonDICT = [String:AnyObject]() 
    var screenstatus = "" 
    var location = "" 
    var recipe = [String]() 
    var selectedrecipe = "" 
} 


//this function turns JSON string into a dictionary 
func jsonStringToDict(_ text: String) -> [String:AnyObject]? 
{ 
    let data = text.data(using: String.Encoding.utf8) 
    do { 
     return try JSONSerialization.jsonObject(with: data!, options: []) as? [String:AnyObject] 
    } 
    catch _ as NSError 
    { 
     print("error") 
    } 
    return nil 
} 

私は私のparseRecipe機能のためヴァディアンのソリューションを使用していたし、私は他の多くの場所で心にレッスンを取るだろうが、私はまだ私が思いついたのソリューションを使用していた他の機能のための私のプロジェクトのいくつかの場所がありました私がここに入れているのは、たとえそれがvadianのようにうまくいかなくても助けになるかもしれない。

if self.avarhub.jsonDICT["recipes"]!.count > 0 
    { 
     for index in 0..<self.avarhub.jsonDICT["recipes"]!.count 
     { 
      let recipes = self.avarhub.jsonDICT["recipes"]! as! Array<Dictionary<String, String>> 
      self.avarhub.recipe.append(recipes[index]["recipe"]!) 
     } 
    } 
    self.tableviewrecipe.reloadData() 
+0

私は質問を明確にするためにいくつかのコードを追加しました。 vadianの提案を試してみよう –

答えて

0

Swift 3では、ランタイムエラーを防ぐために、コンパイラは連続するキーまたはインデックスサブスクリプションのすべての中間オブジェクトの型を知る必要があります。

解決策は、キーの値recipesが辞書の配列であることをコンパイラに伝えることです。

これはあなたの方法と同じですが、醜いCスタイルのループと空のチェックが冗長です。

func parseRecipes() 
{ 
    for recipeItem in self.avarhub.jsonDICT["recipes"] as! [[String:Any]] { 
     self.avarhub.recipe.append(recipeItem["recipe"] as! String) 
    } 
    self.tableviewrecipe.reloadData() 
} 

PS:AnyObjectはAPIの多くのAnyに変更されている、あなたも、あなたのコードを調整することがあります。

+0

私ははるかに引き出された方法でそれを修正した華麗なありがとうが、これはとてもエレガントです –

関連する問題