Я не могу получить структуру, содержащую переменные, загруженные из JSON, в формат, подходящий для табличного представления.
Я некоторое время возился с этим кодом, много читал, но я 'Я просто застрял.Я могу нормально получать данные с сервера и распечатывать их на консоли.Я заметил, что данные печатаются как KEY: «значение», а не «KEY»: «значение», и это может иметь какое-то отношение к этому.Также, поскольку код прямо сейчас, я могу правильно посчитать количество строк и отобразить значение FIRST в табличном представлении.Я не могу понять, как получить доступ к другим переменным для отображения.Любая помощь с благодарностью!
import Cocoa
class ViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource {
static var globalPatientInstance: [Patient] = []
var gotJSON: ([Patient], Error?) -> Void = { (patients, error) in
print("patients from gotJSON: \(patients)")
globalPatientInstance = patients
// this returns an error: "Type 'Patient' does not conform to protocol 'Sequence'"
/*
for (key, value) in patients[0] {
println("\(key) -> \(value)")
tableArray.append(Objects(sectionName: key, sectionObjects: value))
}
*/
print("patients from gotJSON: \(globalPatientInstance[0])")
}
@IBOutlet var tableView: NSTableView!
@IBAction func button(_ sender: Any) {
self.tableView.reloadData()
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.tableView.delegate = self as NSTableViewDelegate
self.tableView.dataSource = self
let url = URL(string: "http://172.16.1.25/backend/returnA")
let returnA = URLRequest(url: url!)
retrieveJSON(with: returnA, completionHandler: gotJSON)
self.tableView.reloadData()
}
func retrieveJSON(with request: URLRequest, completionHandler: @escaping ([Patient], Error?) -> Void) {
// set up the session
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
// make the request
let task = session.dataTask(with: request as URLRequest) {
// completion handler argument
(data, response, error) in
// completion handler
guard let data = data else {
print("Did not recieve data")
completionHandler([], error)
return
}
do {
let decoder = JSONDecoder()
let patients = try decoder.decode(Array<Patient>.self, from: data)
// print(Patient)
completionHandler(patients, error)
}
catch let err {
print("Err", err)
completionHandler([], error)
}
}
task.resume()
}
func numberOfRows(in tableView: NSTableView) -> Int {
return ViewController.globalPatientInstance.count
}
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
var result: NSTableCellView
result = tableView.makeView(withIdentifier: (tableColumn?.identifier)!, owner: self) as! NSTableCellView
result.textField?.stringValue = ViewController.globalPatientInstance[row].FIRST
return result
}
}
Этот код работает нормально.Массив содержит три структуры, и значение FIRST успешно отображается в табличном представлении при нажатии кнопки.