Как соответствовать протоколу последовательности в Swift 4 - PullRequest
0 голосов
/ 25 февраля 2019

В настоящее время пытаюсь проанализировать словарь json на экране в swift, однако я сталкиваюсь с этой ошибкой протокола последовательности, а также с ошибкой несоответствия типов, когда он получает строку / данные и ожидает Int.Ошибка: «Тип 'ProductResponse' не соответствует протоколу 'Sequence'" и

"typeMismatch (Swift.Int, Swift.DecodingError.Context (codingPath: [CodingKeys (stringValue:" code ",intValue: nil)], debugDescription: «Предполагается, что декодирует Int, но вместо этого обнаружил строку / данные.», underError: nil)) «

 struct ProductResponse: Codable {
    let code: String
    let product: Product
    let statusVerbose: String
    let status: Int

    enum CodingKeys: String, CodingKey {
        case code, product
        case statusVerbose = "status_verbose"
        case status
    }
}

struct Product: Codable {
    let code: String
    let productName: String

    enum CodingKeys: String, CodingKey {
        case code
        case productName = "product_name"
    }

}


class ViewController: UIViewController {
    //var products = [Product]()
    let API_URL = "https://carsdata/api/v0/product/5000112630794.json"
    override func viewDidLoad() {
        super.viewDidLoad()
        Alamofire.request(API_URL).responseJSON {
            response in
            let json = response.data
            do
            {
                let decoder = JSONDecoder()
                let productData = try decoder.decode(ProductResponse.self, from: json!)
                for product in productData{  print(product.productName!) } }
            catch
                let err{  print(err) }
        }
    }
}

1 Ответ

0 голосов
/ 25 февраля 2019

Проблема в том, что вы не анализируете JSON, как он есть.У вас есть два объекта здесь.ProductResponse и Product и вы пытаетесь разобрать его как единое целое.productName является частью Product, но вы пытаетесь получить его от ProductResponse.Для ясности я бы порекомендовал вам создать 2 объекта и попробовать это:

struct ProductResponse: Codable {
    let code: String
    let product: Product
    let statusVerbose: String
    let status: Int

    enum CodingKeys: String, CodingKey {
        case code, product
        case statusVerbose = "status_verbose"
        case status
    }
}

struct Product: Codable {
    let code: String
    let productName: String

    enum CodingKeys: String, CodingKey {
        case code
        case productName = "product_name"
    }
}

И вместо этого попробуйте декодировать ProductResponse.self.

...