Swift Decodable проблема - проблема с присвоением значения массиву - PullRequest
0 голосов
/ 27 апреля 2018

У меня проблемы с устранением этой ошибки на self.tvShows = shows.data

Я получаю сообщение об ошибке Невозможно присвоить значение типа 'RecentTvListDays' для типа '[TvShowDetails]?'

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

class TvHomeController: UICollectionViewController, UICollectionViewDelegateFlowLayout    {

fileprivate let cellId = "cellId"

var tvShows: [TvShowDetails]? = []

func fetchTvItems()   {

    let jsonUrlString = "https://www.what-song.com/api/air-episodes"
    guard let url = URL(string: jsonUrlString) else
    {return}

    URLSession.shared.dataTask(with: url) { (data, response, err) in

        guard let data = data else {return}

        do {

            let shows =  try
                JSONDecoder().decode(RecentTvListData.self, from: data)

            self.tvShows = shows.data

            DispatchQueue.main.async {
                self.collectionView?.reloadData()
            }

        } catch let jsonErr {
            print("Error serializing JSON", jsonErr)
        }

        }.resume()
    }
}

Модель

import UIKit

struct RecentTvListData: Decodable  {
var data: RecentTvListDays
}

struct RecentTvListDays: Decodable {
var RecentTvListByDay: [TvShowDetails]
}

struct TvShowDetails: Decodable   {
var _id: Int
var name: String
}

enter image description here

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Ошибка довольно очевидна, несоответствие типов. Посмотрите на ваш код:

  • Массив источника данных tvShows объявлен как [TvShowDetails]?
  • Результат свойства data в декодированной структуре: RecentTvListDays

Типы разные. Это именно то, что сообщение об ошибке

Невозможно присвоить значение типа 'RecentTvListDays' для типа '[TvShowDetails]?

говорит вам. В соответствии со структурой JSON вы должны назначить

let shows =  try JSONDecoder().decode(RecentTvListData.self, from: data)
self.tvShows = shows.data.RecentTvListByDay
0 голосов
/ 27 апреля 2018

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

self.tvShows = shows.data.RecentTvListByDay

Как я уже упоминал в комментариях, вы просто пытаетесь установить другой тип (как на самом деле говорит ошибка).

Примечание / подсказка: всегда начинайте имена переменных и свойств со строчных букв. (Соответствует соглашениям и улучшает читабельность).

...