Невозможно вызвать значение нефункционального типа 'Object' - PullRequest
0 голосов
/ 07 мая 2020

У меня ошибка при попытке разобрать json, я не знаю, что на самом деле пошло не так. так как я хочу сохранить итерацию объекта, и появляется ошибка

Невозможно вызвать значение нефункционального типа 'Mov ie'

вы можете мне сказать почему ошибка? это мой код

static func movies(fromJSON data: Data) -> Result<[Movie], MovieError> {

        let decoder = JSONDecoder()
        decoder.keyDecodingStrategy = .convertFromSnakeCase

        do {
            let jsonData = try decoder.decode(MovieItem.self, from: data)
            var items = [Movie]()

            for movie in jsonData.results {
                // this is the line an error appear in movie(fromJSON: movie)
                if let movie = movie(fromJSON: movie) {
                    items.append(movie)
                }
            }

            return .success(items)
        } catch {
            return .failure(.failedToParseJSON)
        }
    }

    private static func movie(fromJSON movie: Movie) -> Movie? {
        let id = movie.id
        let title = movie.title
        let releaseDate = movie.releaseDate
        let overview = movie.overview
        let posterPath = movie.posterPath

        return Movie(id: id, title: title, releaseDate: releaseDate, overview: overview, posterPath: posterPath)
    }

1 Ответ

1 голос
/ 07 мая 2020

Выражение

 for movie in jsonData.results {
      // this is the line an error appear in movie(fromJSON: movie)
      if let movie = movie(fromJSON: movie) {
          items.append(movie)
      }
 }

использует три (!) Разных movie переменных. Это сбивает компилятор с толку. Переименуйте метод, например,

private static func createMovie(fromJSON movie: Movie) -> Movie? { ...

и

if let movie = createMovie(fromJSON: movie) {
   items.append(movie)
}

Кстати, большая часть вашего кода избыточна. И никогда не возвращайте бессмысленную пользовательскую ошибку в контексте Decoding, возвращайте реальный DecodingError.

Фактически вы можете заменить весь свой код этим

static func movies(fromJSON data: Data) -> Result<[Movie], Error> {
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    return Result{ try decoder.decode(MovieItem.self, from: data).results }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...