2017-01-16 16 views
1

私は、ユーザーの場所を把握し、Google Maps APIを使用して簡単な天気データを表示する簡単な天気アプリを作成しようとしています。私がJSONをとり、アドレスを取得するこの部分を除いて、すべてが機能しています。行でNSDataをSwift 3のデータに変換するには?

func getAddressForLatLng(latitude: String, longitude: String) { 
    let url = NSURL(string: "\(baseUrl)latlng=\(latitude),\(longitude)&key=\(apikey)") 
    let data = NSData(contentsOf: url! as URL) 
    let json = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as! Dictionary 
    if let result = json["results"] as? Dictionary { 
     if let address = result[0]["address_components"] as? Array { 
      let number = address[0]["short_name"] as! String 
      let street = address[1]["short_name"] as! String 
      let city = address[2]["short_name"] as! String 
      let state = address[4]["short_name"] as! String 
      let zip = address[6]["short_name"] as! String 
      weatherDisplay.text = "\(city),\(state)" 
     } 
    } 
} 

let json = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as! Dictionary 

私はこのエラーを取得する:

Cannot invoke 'jsonObject' with an argument list of type '(with: NSData?, options: JSONSerialization.ReadingOptions)' 

は私が間違って何をしているのですか?

+5

全くここにNSDataの(またはNSURL)を使用する必要はありません。 'let url = URL(string:...)'、 'let data = Data(contentsOf:...)' –

+0

問題はあなたが 'JSONSerialization'にオプションを渡していることです。データの展開を強制することができます。 'JSONSerialization.jsonObject(with:data !, options:JSONSerialization.ReadingOptions.allowFragments)を! Dictionary' –

+2

Swift 3で 'NSData(contentsOf:url!as URL)'(または 'Data(contentsOf:)')を使うのは悪い考えです。これは同期呼び出しであり、完了するまでUIをフリーズします。 NSURLSessionを使用するには、これを実際に書き換える必要があります。 –

答えて

3

カップルを変更する必要があります。まず、NSDataを使用しています。スウィフトタイプDataを使用してください。 NSData?からData?に変換するには、変数宣言の末尾にas Data?を追加するだけです。

また、あなたのタイプはオプションですが、オプションのタイプに渡すことはできませんので、あなたは、(この例、if let data = data { /* stuff here */}では、使用して)それをアンラップする必要があります。

func getAddressForLatLng(latitude: String, longitude: String) { 
    let url = NSURL(string: "\(baseUrl)latlng=\(latitude),\(longitude)&key=\(apikey)") 
    let data = NSData(contentsOf: url! as URL) as Data? // <==== Added 'as Data?' 
    if let data = data { // <====== Added 'if let' 
     let json = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as! Dictionary 
     if let result = json["results"] as? Dictionary { 
      if let address = result[0]["address_components"] as? Array { 
       let number = address[0]["short_name"] as! String 
       let street = address[1]["short_name"] as! String 
       let city = address[2]["short_name"] as! String 
       let state = address[4]["short_name"] as! String 
       let zip = address[6]["short_name"] as! String 
       weatherDisplay.text = "\(city),\(state)" 
      } 
     } 
    } 
} 

更新:

を変更する必要があるもう一つは、次のとおりです。

let json = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as! Dictionary 

あなたがタイプDictionary、コンパイラの雌ジカにキャストするとDictionarygeneric typeなので、あなたが話していることは分かりません。したがって、Dictionary<String, AnyObject>または[String: AnyObject]にキャストする必要があります(これらは同じです)。

+0

迅速な対応をありがとう!今すぐそれは(let = json行で) "Generic Parameter 'key'は 'Dictionary <_,_>'へのキャストで推論できませんでした –

+0

@EricPhillips私の答えを更新しました! –

+0

今、 'if address = result [0] [" address_components "]は?配列{'、それは"メンバー '下付き文字'へのあいまいな参照を言います。追加/変更する必要があるものはありますか? –

関連する問題