Синтаксис для доступа к свойству struct с типом enum в модели JSON - PullRequest
0 голосов
/ 02 декабря 2018

Я пытаюсь получить доступ к строке URL, содержащейся в некоторых данных JSON.

Строка содержится в массиве "urls" с типом "detail", как показано ниже.

JSON DATA

Я использовал quicktype для построения моей модели, как показано ниже:

struct Response: Codable {
    let data: DataClass
}

struct DataClass: Codable {
    let results: [Result]
}

struct Result: Codable {
    let name: String
    let description: String
    let thumbnail: Thumbnail
    let urls: [URLElement]


}

    struct Thumbnail: Codable {
        let path: String
        let thumbnailExtension: Extension

        enum CodingKeys: String, CodingKey {
            case path
            case thumbnailExtension = "extension"
        }
    }

    enum Extension: String, Codable {
    case jpg = "jpg"
}

struct URLElement: Codable {
    let type: URLType
    let url: String
    }

    enum URLType: String, Codable {
        case comiclink = "comiclink"
        case detail = "detail"
        case wiki = "wiki"
    }

Я попытался получить к ней доступ, объявив ее так...

var urlelement: URLElement!


    override func viewDidLoad() {
        super.viewDidLoad()
        let detailurl = urlelement.url
        print(detailurl)

... но всегда возвращает пустую строку.Любые предложения будут приветствоваться.Спасибо!

1 Ответ

0 голосов
/ 02 декабря 2018

Сначала загрузите JSON, затем пользователь JSONDecoder

let url = URL (строка: "ваш URL")!

URLSession.shared.dataTask (with: url) {(data, ответ, ошибка) в

if let error = error {
    print("error \(error.localizedDescription)")
    return
}

guard let data = data else { return }

do {
    let response = try JSONDecoder().decode(Response.self, from: data)
    // use this

    response?.data.results.forEach({ (rsl) in
        rsl.urls.forEach({ (element) in
            print(element.type, element.url)
        })
    })

    // or this one

    for rsl in response!.data.results {
        for element in rsl.urls {
            print(element.type, element.url)
        }
    }
} catch let error {
    print("error while decoding the json \(error.localizedDescription)")

}

}.resume()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...