2016-10-20 3 views
0

После предыдущих проблем с этим конкретным кодом приложения, как «решенные» с помощью, новая проблема возникла с этим кодом:Swift 3 компилятор Ошибка с JSON и словарями в пределах URLSession.shared.dataTask

var properties: [String] = [] 
var unsortedDetails: [String] = [] 
var contacts: [[String]] = [] 
var propertySorting: [(key: String, ind: String, link: Bool)] = [] 
var autolinks: [Bool] = [] 

и, в функции viewDidLoad:

let contactsRequest = URLRequest(url: URL(string: "https://script.google.com/macros/s/AKfycbxOLElujQcy1-ZUer1KgEvK16gkTLUqYftApjNCM_IRTL3HSuDk/exec?id=" + ID + "&sheet=" + Industry.replacingOccurrences(of: " ", with: "+", options: NSString.CompareOptions.literal, range: nil))!) 

     let contactsTask = URLSession.shared.dataTask(with: contactsRequest as URLRequest) 
     {(data, response, error) in 
      do { 
       let jsonResult: Dictionary = try JSONSerialization.jsonObject(with: data!, options: []) as! [String : Any] 

       let results = jsonResult[self.Industry] as! [[String : Any]] 

       for key in results[0].keys { 
        self.propertySorting.append(key: (key as? String)!, ind: results[0].value(forKey: key as! String) as! String, link: results[1].value(forKey: key as! String) as! String != "X") 
       } 
       self.propertySorting.sort(by: {Int($0.ind) < Int($1.ind)}) 

       for property in self.propertySorting { 
        self.properties.append(property.key) 
        self.autolinks.append(property.link) 
       } 

       for contact in results { 
        self.contacts.append([]) 
        for key in self.properties { 
         self.contacts[self.contacts.count-1].append(contact.value(forKey: key) as! String) 
        } 
       } 

       DispatchQueue.main.async(execute: { 
        let listController = self.viewControllers[0] as! ListController 

        listController.properties = self.properties 
        listController.contacts = self.contacts 
        listController.autolinks = self.autolinks 

        listController.tableView.reloadData() 
       }) 

      } catch { 
       print("FATAL ERROR") 
      } 
     } 

     contactsTask.resume() 

вопросов в настоящее время являются встречающиеся: Extra argument 'ind' in call когда propertySorting.append (...) называется, и если это (ранее работавшим) ind раздел будет удален, та же ошибка возвращаются для link

+0

jsonResult вместо результата, и вы получили все ключи –

+0

Причиной является результат [0], к которому вы теперь обращаетесь, не относится к типу NSDictionary. Определите это как 'let result0: NSDictionary = results [0];' Синтаксис может быть неправильным, пожалуйста, измените его approriate. – nynohu

ответ

2

Вместо NSArrayNSDictionary и используется Swift родной Array и Dictionary и использовать keys с Dictionary, чтобы получить массив всех ключей.

let jsonResult: Dictionary = try JSONSerialization.jsonObject(with: data!, options: []) as! [String : Any] 
let results = jsonResult[self.Industry] as! [[String : Any]] 

for key in results[0].keys { 

} 

Примечание: Там нет необходимости использовать .mutableContainers вариант с Swift объекта родной типа.

+0

Это определенно очищает внешний вид кода и дает больше смысла - однако он вводит две новые проблемы (хотя, по-видимому, удаляет остальные): Первая проблема заключается в том, что она утверждает, что я ввел дополнительное значение в этой строке: 'self.propertySorting.append (key: (key as? String) !, ind: results [0] .value (forKey: key as! String) as! String, link: results [1] .value (forKey: key as String! = "X") ' Несмотря на:' var propertySorting: [(ключ: String, ind: String, link: Bool)] = [] '(и он работал нормально до) Он также затем утверждает, что 'contact' не имеет значения' value' –

+0

Извините, по 'extra value' Я имею в виду, что в 'propertySorting' нет значения' ind', и если я удалю эту часть (несмотря на ее правильность) в этой строке , тогда он утверждает то же самое для «link» –

+0

@ OscarCooke-Abbott. Для этого вам нужно показать мне e type 'propertySorting', а также показать этот настраиваемый метод append –