2016-10-12 2 views
0

Я, кажется, подобрали несколько ошибок, так как обновление для быстрой 3GooglePlaces API Swift 3 Выпуск

 // Issue #1 
     let correctedAddress:String! = self.searchResults![(indexPath as NSIndexPath).row].addingPercentEncoding(withAllowedCharacters: CharacterSet.symbols) 
     print(correctedAddress) 
     let url = URL(string: "https://maps.googleapis.com/maps/api/geocode/json?address=\(correctedAddress)&sensor=false") 

     let task = URLSession.shared.dataTask(with: url!) { 
      data, response, error in 

      do { 
       if data != nil{ 
        let dic = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableLeaves) as! NSDictionary 

        // Issue #2 
        let results = dic["results"] as! [String: Any] 
        let geometry = results["geometry"] as! [String: Any] 
        let location = geometry["location"] as! [String: Any] 

        let lat = location["lat"] as! Double 
        let lon = location["lng"] as! Double 

        self.delegate.locateWithLongitude(lon, andLatitude: lat) 
       } 
      } 
      catch { 
       print("Error") 
      } 
     } 
     task.resume() 

выпуск № 1: correctedAddress, в качестве примера, возвращает значение "%51%75%C3%A9%62%65%63%2C%20%43%61%6E%61%64%61". Тем не менее, по какой-то причине константа url возвращает nil и вызывает сбой.

Я не понимаю, почему он возвращает нуль. Я могу заменить correctedAddress внутри URL-адреса со значением %51%75%C3%A9%62%65%63%2C%20%43%61%6E%61%64%61, поэтому полный URL-адрес:

let url = NSURL(string: "https://maps.googleapis.com/maps/api/geocode/json?address=%51%75%C3%A9%62%65%63%2C%20%43%61%6E%61%64%61&sensor=false") и он отлично работает.

выпуск № 2: Он падает как раз в let results, к которому я вернусь ошибку Could not cast value of type '__NSArrayI' (0x108bb0c08) to 'NSDictionary' (0x108bb1108).

ответ

1

Попробуйте приведенный ниже код для выпуска # 2

let results = dic["results"] as! NSArray 
for result in results { 
    let strObj = result as! NSDictionary 
    let geometry = strObj["geometry"] as! NSDictionary 
    let location = geometry["location"] as! NSDictionary 
    let lat = location["lat"] as! NSNumber 
    let lon = location["lng"] as! NSNumber 
} 

для выпуска № 1, попробуйте ниже кода

let valueAtIndex = self.searchResults![(indexPath as NSIndexPath).row].addingPercentEncoding(withAllowedCharacters: CharacterSet.symbols) 
guard let correctedAddress = valueAtIndex else { return } 
let adrString:String = "https://maps.googleapis.com/maps/api/geocode/json?address=\(correctedAddress)&sensor=false" 
let url:URL = URL(string: adrString)! 
+0

Вопрос №2 решен, но вопрос № 1 не является. Не могли бы вы объяснить, почему он решает проблему №2 и почему мой код не работает? – luke

+0

На самом деле проблема связана не с вашим кодом, а с сервером, возвращающим ответ. Также в Swift 3 при вычислении переменной в значение с помощью '\()' для конкатенации или для каких-либо других целей вы не применяете восклицательный знак в конце, то есть '!', Тогда он попытается создать URL-адрес с чем-то например: 'https://maps.googleapis.com/maps/api/geocode/json?address=Optional("%51%75%C3%A9%62%65%63%2C%20%43%61 % 6E% 61% 64% 61 ")! & Sensor = false", который возвращает Url как nil, так что это причина для проблемы 1, поэтому, глядя на это, попробуйте отладить код проблемы 1, будет очень небольшая проблема –

+1

И что касается выпуска2 Проблема в том, что ответ от сервера все испорчен, поэтому мне пришлось много раз поиграть и выяснить, какой тип должен отличать ответ как. Хотя интересный вопрос, так что я открыл игровую площадку и начал ying с типом ответа и wallah .. Он был разрешен к счастью :) Cheers !! –

Смежные вопросы