Получить JSON, разобрать его в массив и распечатать в Swift - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь получить данные json из API, разобрать их в массив struct и распечатать массив. Но когда я пытаюсь распечатать его, возвращается только пустой массив. Я пытаюсь понять, как писать код для асинхронных операций, и я не уверен, куда идти дальше. Может ли кто-нибудь указать мне правильное направление? Я пробую это на игровых площадках, используя Xcode 9, Swift 4.

import Foundation

struct Item: Decodable {
    var userId: Int?
    var id: Int?
    var title: String?
    var body: String?
}

var items = [Item?]()

let completionHandler = { (data: Data?, response: URLResponse?, error: Error?) in
        if error != nil {
            print("Error occured: \(error.debugDescription)")
        }
        
        let decoder = JSONDecoder()
        do {
            items = try decoder.decode([Item].self, from: data!)
            print(items)
        } catch {
            print("Error: Unable to fetch data")
        }
    }

func getJson() {
    let url = URL(string: "https://jsonplaceholder.typicode.com/posts")!
    let session = URLSession.shared
    let task = session.dataTask(with: url, completionHandler: completionHandler)
    task.resume()
    print(items)
}

getJson()

1 Ответ

0 голосов
/ 04 сентября 2018

Чтобы иметь возможность запускать асинхронные вещи на игровой площадке, вы должны добавить

import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true

Три ноты:

  1. Строка print после resume не имеет смысла. Он всегда будет печатать пустой массив. Строка print в обработчике завершения показывает реальный результат
  2. Объявить items как

    var items = [Item]()
    

    JSONDecoder() возвращает что-то не необязательное или выдает ошибку

  3. Этот конкретный API отправляет всегда все поля, так что вы даже можете объявить все элементы структуры как необязательные

    struct Item: Decodable {
        var userId: Int
        var id: Int
        var title: String
        var body: String
    }
    
...