2016-10-03 6 views
2

私はこれを数日間続けました。
私は単に私のプロジェクトをSwift 2からSwift 3に変換しようとしています。私はかなりのエラーを修正しました。
しかし、私は最後の19まで、すべて同じエラーです。
基本的に、私はJSONオブジェクトを返す要求をサーバーに持っています。
JSONオブジェクトには、その横にオブジェクトがネストされています。
私はグーグルで何度も何度も読んで様々なことを試みてきましたが、残念ながら何も働いていませんでした。
何か助けていただければ幸いです。
(注:私はすでに試したことを投稿するために以前の質問で質問されています。
この問題を解決するためにさまざまな方法を試みましたのでここでは行いません)スイフト:スウィフト2からスウィフト3への変換が失敗する

エラー:問題を修正上記の

if let response = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] { 
    if let data = response["data"] as? NSArray { 
     for (index, item):[String:AnyObject] in data.enumerated() { 
      let id = item["id"] as! String 
     } 
    } 
} 

if let response = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] { 
    if let data = response["data"] as? NSArray { 
     for (index, item) in data.enumerated() as? NSArray { 
      let id = item["id"] as! String 
     } 
    } 
} 

if let response = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] { 
    if let data = response["data"] as? NSArray { 
     for item in data as? NSArray { 
      let id = item["id"] as! String 
     } 
    } 
} 

なし:添字メンバー

if let response = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] { 
    if let data = response["data"] as? NSArray { 
     for (index, item) in data.enumerated() { 
      let id = item["id"] as! String 
     } 
    } 
} 

は、ここに私が試してみましたいくつかのことではない持っています。ここで私が参照したSOFの質問は以下のとおりです。

  1. type any? has no subscript members
  2. Facebook SDK error for subscript members
  3. Type 'Any' has no subscript members (firebase)
  4. Type 'Any' Has no Subscript Members in xcode 8 Swift 3
  5. Type 'Any' has no subscript members after updating to Swift 3

がすべてのヘルプは大歓迎です!

+0

「NSArray」としてキャストしないでください。迅速な型を使用し、それを '[[String:String]]]またはそれにキャストします。 – dan

+0

少なくともデータ ":"の後に10文字までJSONを表示してください。 – vadian

答えて

1

よし

if let response = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary { 
    if let data = response["data"] as? [AnyObject] { 
     for (index, item) { 
      if let id = item["id"] as! String{ 
       print(id) 
      } 
     } 
    } 
} 

または

let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary    

    if let parseJson = json {    
    if let data = parseJson["data"] as? [AnyObject] {     
    for signleArray in data {     
      if let customObjects = signleArray as? [AnyObject] {     
      for customObject in customObjects {     
       let userId = customObject["id"] as! String 
       } 
      } 
      } 
     } 
     } 

を0ndre_の助けを借りて、ここで問題を解決しました。残念ながら、多次元/ネストされたオブジェクトの完全な修正ではありませんでしたので、アプリケーションが呼び出すAPIを変更する必要がありました。

if let response = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary { 
    if let data = response["data"] as? [AnyObject] { 
     for (index, item) in data.enumerated() { 
      let id = item["id"] as! String 
     } 
    } 
} 
1

こんにちはあなたはこの試みることができますいくつかの後ので、ちょうど私はそれが働いたか知っているので、我々はそれを把握することができます:)

+0

これらのオプションはどちらも機能しませんでしたが、お試しいただきありがとうございます。 SwiftJSONを実装しなければならなくなるかもしれませんが、これは私がやらなければならないことではありません。私はサードパーティのモジュールに頼る必要はありません。 – recoilnetworks

1

あなたはNSArrayが、[AnyObject]にキャストべきではありません。 NSArrayを列挙するとき、スウィフト3ではid item type maps to Anyが実際には添え字を持たない。 AnyAnyObjectin the standard library documentationの詳細については、idAnyAnyObjectとして扱うためのこのSwift 3の変更の根拠についてはin this Swift evolution proposalと説明しています。 JSON解析のためにこのようなSwiftyJSONなどサードパーティのライブラリを使用してについて

 let inputData:Data = "{\"data\": [{\"id\":\"x\"},{\"id\":\"y\"},{\"id\":\"z\"}]}".data(using: .utf8)! 

     if let response = try JSONSerialization.jsonObject(with: inputData, options: []) as? [String:AnyObject], 
     let responseData = response["data"] as? [AnyObject] 
     { 
      for (index, item) in responseData.enumerated() 
      { 
       let id = item["id"] as! String 
       print(id) 
      } 
     } 

は、あなたがサードパーティのモジュールを好きではないかもしれないが、あなたのコードは、上記の項目がキー「ID」を持っていない場合(不正な入力にクラッシュしたり、それがならされます文字列ではありません)。もちろんSwiftyJSONやFreddyのようなライブラリはSwiftに堅牢なJSON解析コードを書く唯一の方法ではありませんが、Cocoaが提供する機能は確かにプログラマの利益のためにSwift型システムを使用しておらず、悪いそのAPIを入力すると、解析タスクが複雑になります(実際にプログラムをクラッシュさせるべきではなく、エラーとして報告する必要があります)。

関連する問題