我正在学习在 Xcode 游乐场中使用 JSON 解码数据,但无法弄清楚我的代码有什么问题,我无法返回数据也无法对其进行解码。这是我的代码:
import UIKit
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
extension URL {
func withQueries(_ queries: [String: String]) -> URL? {
var components = URLComponents(url: self, resolvingAgainstBaseURL: true)
components?.queryItems = queries.flatMap { URLQueryItem(name: $0.0, value: $0.1) }
return components?.url
}
}
struct StoreItems: Codable {
let results: [StoreItem]
}
struct StoreItem: Codable {
var name: String
var artist: String
var kind: String
var artworkURL: URL
var description: String
enum CodingKeys: String, CodingKey {
case name = "trackName"
case artist = "artistName"
case kind
case artworkURL
case description
}
enum AdditionalKeys: String, CodingKey {
case longDescription
}
init(from decoder: Decoder) throws {
let valueContainer = try decoder.container(keyedBy: CodingKeys.self)
name = try valueContainer.decode(String.self, forKey: CodingKeys.name)
artist = try valueContainer.decode(String.self, forKey: CodingKeys.artist)
kind = try valueContainer.decode(String.self, forKey: CodingKeys.kind)
artworkURL = try valueContainer.decode(URL.self, forKey: CodingKeys.artworkURL)
if let description = try? valueContainer.decode(String.self, forKey: CodingKeys.description) {
self.description = description
} else {
let additionalValues = try decoder.container(keyedBy: AdditionalKeys.self)
description = (try? additionalValues.decode(String.self, forKey: AdditionalKeys.longDescription)) ?? ""
}
}
}
func fetchItems(matching query: [String: String], completion: @escaping ([StoreItem]?) -> Void) {
let baseURL = URL(string: "https://www.itunes.apple.com/search?")!
guard let url = baseURL.withQueries(query) else {
completion(nil)
print("Unable to build URL with supplied queries.")
return
}
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
let decoder = JSONDecoder()
if let data = data,
let storeItems = try? decoder.decode(StoreItems.self, from: data) {
completion(storeItems.results)
} else {
print("Either no data was returned or data was not properly decoded.")
completion(nil)
return
}
}
task.resume()
}
let query: [String: String] = [
"term": "Inside Out 2015",
"media": "movie",
"lang": "en_us",
"limit": "10"
]
fetchItems(matching: query) { (items) in
print(items)
}
这是打印到控制台的内容,我猜这表明我的“任务”有问题:
未返回数据或未正确解码数据。
零