Невозможно присвоить значение типа «[ViewController.MyStruct]» для типа «[ViewController.MyOtherStruct]» - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь декодировать некоторый JSON , и я получаю сообщение об ошибке:

Cannot assign value of type '[ViewController.Response]' to type '[ViewController.Doc]'

Насколько я вижу, обе структуры настроены одинаково, поэтому я не понимаю, в чем здесь проблема.

Это мои структуры:

struct Status: Decodable {
    let status: String
    let response: [Response]
}

struct Response: Decodable {
    let docs: [Doc]
}

struct Doc: Decodable {
    let webUrl: String
    let abstract: String

    enum CodingKeys: String, CodingKey {
        case webUrl = "web_url"
        case abstract
    }

    init(from decoder:Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        abstract = try container.decode(String.self, forKey: .abstract)
        webUrl = try container.decode(String.self, forKey: .webUrl)
    }
}

Ошибка возникает при вызове моей fetchData функции в viewDidLoad (ошибка в случае .success в object.response):

    fetchData(url: jsonUrl) { (result: FetchResult<Status>) in
        switch result {
        case .success(let object): self.storyData = object.response
        print("Results \n\n\n\n \(object.response)")
        case .failure(let error): print(error)
        }
    }

EDIT: это массив, который я заполняю данными JSON:

var storyData = [Doc]()

1 Ответ

0 голосов
/ 02 ноября 2018

storyData имеет тип [Doc], поэтому вы не можете присвоить ему значение типа [Response]. Вам необходимо получить доступ к docs свойству Response, что можно сделать, вызвав flatMap на response, чтобы получить все документы из массива ответов и сгладить результат, чтобы получить [Doc] вместо [[Doc]], который вы можете присвоить storyData.

fetchData(url: jsonUrl) { (result: FetchResult<Status>) in
    switch result {
        case .success(let object): 
            self.storyData = object.response.flatMap{$0.docs}
            print("Results \n\n\n\n \(object.response)")
        case .failure(let error):
            print(error)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...