2016-11-14 17 views
-3

JSONから多次元配列を取り込み、NSArrayオブジェクトに格納しようとしています。私はピッカーを使ってそのオブジェクトを反復したいと思う。これはSwift 2で機能しましたが、すぐに私はswift 3に変換されました。私のpickerView関数には、「Any型には添え字メンバーがありません」というエラーが出ます。Swift 3 JSON多次元NSArrayを文字列に変換する

関連するコード(名前と顔が変更された):

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
    let ticket_number = pvds_ticket_number[row]["ticket_number"] as! String 
    let customer_name = pvds_ticket_number[row]["customer_name"] as! String 
    return "\(ticket_number) - \(customer_name)" 
} 

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) 
{ 
    let ticket_number = pvds_ticket_number[row]["ticket_number"] as! String 
    txt_ticket_number.text = ticket_number 
} 

func get_tickets() 
{ 
    let userID = UserDefaults.standard.string(forKey: "userID") 
    let url_path: NSString = "my_url_that_isnt_relevant" as NSString; 
    let url_path_formatted: NSString = url_path.addingPercentEscapes(using: String.Encoding.utf8.rawValue)! as NSString 

    let url = URL(string: url_path_formatted as String) 
    let session = URLSession.shared 

    let task = session.dataTask(with: url!, completionHandler: {data, response, error -> Void in 

     if(error != nil) { 
      // If there is an error in the web request, print it to the console 
      print(error!.localizedDescription) 
     } 


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

      if let parseJSON = json { 
       if let results: NSArray = parseJSON["results"] as? NSArray{ 
        DispatchQueue.main.async(execute: { 
         self.pvds_ticket_number = results as! [Any] as NSArray 
         self.pv_ticket_number.reloadAllComponents() 
        }) 
       } 
     } 

     } catch { 
      print("something went wrong") 
     } 

    }) 

    task.resume() 

} 

これらの行は、エラーを示す:
としてticket_number = pvds_ticket_number [行] [ "ticket_number"]ましょう!文字列
let customer_name = pvds_ticket_number [row] ["customer_name"]を!文字列

+0

これをチェックしましたか?http://stackoverflow.com/search?q=%5Bswift%5DType+Any+has+no+subscript+members –

+1

[これらの53の結果](http://stackoverflow.com/ 「任意の下付き文字がありません」と検索された場合、検索?tab = votes&q =%5bswift3%5d%20Any%20has%20no%20subscript%20members)が役に立ちましたか? – Moritz

答えて

0

pvds_ticket_numberNSArray<Any>と指定されています。あなたがそれにアクセスするとき、あなたはNSArray<[String: String]>のようにそれを扱っています。

問題を引き起こしている最初の行は、let ticket_number = pvds_ticket_number[row]["ticket_number"] as! Stringです。コンパイラはpvds_ticket_numberが配列なので、[row]を使うとうまくいきます。しかし、コンパイラはインデックスrowにどのような種類やオブジェクトがあるのか​​わからないので、タイプAnyとみなします。コンパイラーがタイプAnyに添え字メソッドを持っていないと正しく言っています。

これを処理する最も簡単な方法は、pvds_ticket_number配列に関するコンパイラに詳細情報を提供することです。あなたはそれを割り当てるときに現在あなたが使用します。

self.pvds_ticket_number = results as! [Any] as NSArray

あなたは、具体的ArrayArrayを使用することを検討していないことをNSArrayから何かを必要としない限りで起動します。上記の行は、より多くのようなものになると思われる場合:

self.pvds_ticket_number = results as! [[String: String]]

これはあなたの配列は、キーと値の両方の文字列と辞書の配列であることを前提として、あなたはに基づいて、そのビットを変更する必要があるかもしれません辞書が実際に作られているもの。

+0

[String:String]を使用するようにコードを修正しました。しかし、私は今、私が前のエラーを持っているそれらの行の下付き文字を覚えておくために 'あいまいな参照'を取得しています。 – smstarr

+0

'pvds_ticket_number'を変数として宣言しています。私はそれが '[String:String]'ではなくNSArrayとして定義されていると推測しています。疑問がある場合は、問題が実際にどこにあるかをよりよく理解するために、行を複数の行に分割してください。 – theMikeSwan

+0

これはvarとして宣言されています。pvds_ticket_number = [String:String]() – smstarr

-1

私はあなただったらswiftyjsonのココアポッドを使用します。私は似たような問題に苦しんでいましたが、どれだけ学んだとしても、いつも出てくるようでした。 Swiftyjsonは軽くて使いやすいので、何時間も座って技術的な負債を発生させる必要がなく、簡単な解決策を見つけ出すことができます。

+0

ありがとう、私はそれをチェックアウトします。 私は仕事のために簡単なアプリを作ろうとしているので、それを手に入れる人のように、それは難しいです。 – smstarr

関連する問題