Было бы лучше использовать структуру, например, в вашем случае:
struct Data: Codable {
let id: Int
let first_name: String
let last_name: String
let email: String
let created: Date
let modified: Date
}
Затем вы создаете переменную той структуры, в которой вы будете хранить ее:
var dataVariable = [Data]()
Тогда вы можете сделать свой URL-вызов как:
func getData(arr: Bool, completion: @escaping (Bool) -> ()) {
let urlJSON = "URL"
guard let url = URL(string: urlJSON) else { return }
URLSession.shared.dataTask(with: url) { (data, response, err) in
guard let data = data else { return }
do {
let getData = try JSONDecoder().decode([Data].self, from: data)
self.dataVariable = getData
} catch let jsonErr {
print("error serializing json: \(jsonErr)")
}
completion(arr)
}.resume()
}
Затем вы можете получить доступ ко всему этому из dataVariable var. Если вы делаете это в классе Manager, вы можете получить к нему доступ из любого ViewController.
Для доступа:
let firstNameString = dataVariable[0].first_name
Если не существует нескольких одинаковых деревьев, просто убедитесь, что оно:
let getData = try JSONDecoder().decode(Data.self, from: data)
Edit:
В вашем случае укажите выше:
let task = session.dataTask(with: request, completionHandler: {
(data, response, error) in
if let error = error {
print("error")
}
else if let response = response {
print("response")
}
else if let data = data {
let getData = try JSONDecoder().decode([Data].self, from: data)
self.dataVariable = getData // <- Just decode here
print(data)
}
DispatchQueue.main.async { // Correct
guard let responseData = data else {
print("Error: did not receive data")
return
}
print(String(data: responseData, encoding: String.Encoding.utf8) ?? "")
}
})
task.resume()