如何解决存储 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 举报,一经查实,本站将立刻删除。