Próbuję rozszyfrować niektóre JSON i ciągle otrzymuję błąd:

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

O ile widzę, obie struktury są skonfigurowane w ten sam sposób, więc jestem zdezorientowany, o co chodzi.

To są moje structs:

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)
    }
}

Błąd jest zgłaszany, gdy wywołuję moją funkcję fetchData w viewDidLoad (błąd w przypadku .success w 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)
        }
    }

EDYCJA: To jest tablica, którą wypełniam danymi JSON:

var storyData = [Doc]()
0
KingTim 2 listopad 2018, 17:52

1 odpowiedź

Najlepsza odpowiedź

storyData jest typu [Doc], więc nie możesz przypisać do niego wartości typu [Response]. Musisz uzyskać dostęp do właściwości docs Response, co możesz zrobić, wywołując flatMap na response, aby pobrać wszystkie dokumenty z tablicy odpowiedzi i spłaszczyć wynik, aby uzyskać [Doc] zamiast [[Doc]], które możesz przypisać do 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)
    }
}
1
Dávid Pásztor 2 listopad 2018, 18:16