存储 TMDB API 数据
Store TMDB API data
我正在开发一个需要使用 TMDB API 的应用程序。我一直在尝试将 API 的结果存储在一个结构中,但它一直给我错误:
No exact matches in call to subscript
这是结构:
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)
另一条评论,您已将结构中的所有属性设为可选,虽然这是一种简单的方法,但在使用类型时可能会导致隐藏一些解码问题和更繁琐的代码。除非真的需要,否则我建议不要使用可选的。
我正在开发一个需要使用 TMDB API 的应用程序。我一直在尝试将 API 的结果存储在一个结构中,但它一直给我错误:
No exact matches in call to subscript
这是结构:
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)
另一条评论,您已将结构中的所有属性设为可选,虽然这是一种简单的方法,但在使用类型时可能会导致隐藏一些解码问题和更繁琐的代码。除非真的需要,否则我建议不要使用可选的。