微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

存储 TMDB API 数据

如何解决存储 TMDB API 数据

我正在开发一个需要使用 TMDB API 的应用。我一直试图将 API 的结果存储在一个结构中,但它一直给我错误

调用下标时没有完全匹配

这是结构:

struct MovieList: Codable {
    let dates: Date?
    let page: Int?
    let results: [Result]?
    let total_pages: Int?
    let total_results: Int?
}

struct Result: Codable {
    let adult: Bool?
    let backdrop_path: String?
    let genre_ids: [Int]?
    let id: Int?
    let original_language: String?
    let original_title: String?
    let overview: String?
    let popularity: Int?
    let poster_path: String?
    let release_date: String?
    let title: String?
    let video: Bool?
    let Vote_average: Float?
    let Vote_count: Int?

这是我的 API 调用

public class LoadTMDBData {

  var tmdbMoviesData = [[Result]]()

init() {
  getTMDBData()
}

func getTMDBData() {
    guard let url = URL(string: "") else {
          fatalError("Invalid URL")
      }
    // Set session configuration to default
    let config = URLSessionConfiguration.default
    let session = URLSession(configuration: config)
    let task = session.dataTask(with: url) { data,response,error in
      
      // Check that data has been returned
      guard let data = data else { return }
      do {
        let tmdbData = try JSONDecoder().decode([MovieList].self,from: data)
        self.tmdbMoviesData = tmdbData["result"]
      }
      catch{
        let error = error
        print(error.localizedDescription)
      }
    }
  // execute the HTTP request
  task.resume()
}

解决方法

当使用结构体时,您不使用像 ["someProperty"] 这样的字符串键访问其属性,而是使用点符号 .someProperty,以便获得 results 属性

let results = myMoveList.results

这里稍微复杂一点的是,正如您正确编码的那样,您拥有一个 MovieList 数组,并且您想将所有结果提取到一个数组数组中。

为此,您可以使用高阶函数 map 来执行此操作

self.tmdbMoviesData = tmdbData.map(\.results)

但由于 results 是可选的,我们使用类似的函数来过滤掉任何 nil 值,compactMap

self.tmdbMoviesData = tmdbData.compactMap(\.results)

另一条评论,您已将结构中的所有属性设为可选,虽然这是一种简单的方法,但在使用类型时可能会导致隐藏一些解码问题和更麻烦的代码。除非确实需要,否则我建议不要使用 optional。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。