Я пытаюсь создать простое приложение для поиска песен, используя API last.fm и быстрый пользовательский интерфейс. Когда я использую декодер с API-интерфейсом iTunes, он работает нормально, но когда я пытаюсь использовать last.fm, мое представление пусто, поэтому я предполагаю, что, возможно, объекты, которые я определил для json, неверны? Что-то новое в быстром, особенно чтение json-файлов из apis, так что это очень запутанно. Любая помощь/советы будут очень признательны.
ссылка на API: https://www.last.fm/api/show/track.search
struct TracksRow: View {
@State var term = "hello"
@State var results = [Tracks]()
var body: some View {
List(results, id: \.songName){ item in
VStack(alignment: .leading) {
Text(item.songName)
.font(.headline)
Text(item.singerName)
}
}.onAppear(perform: loadData)
}
func loadData(){
guard let url = URL(string: "http://ws.audioscrobbler.com/2.0/?method=track.search&track=\(term)&api_key=d527fc1829aecc7e54b63367b3d4621a&format=json") else {
print("Invalid URL")
return
}
let request = URLRequest(url: url)
URLSession.shared.dataTask(with: request) { data, response, error in
if let data = data {
if let decodedResponse = try? JSONDecoder().decode(SongResponse.self, from: data) {
DispatchQueue.main.async {
self.results = decodedResponse.songs.trackMatches.matches
}
return
}
}
}.resume()
}
}
struct TracksRow_Previews: PreviewProvider {
static var previews: some View {
TracksRow()
}
}
JSON-объекты:
struct SongResponse: Codable{
let songs : TrackResults
enum CodingKeys: String, CodingKey {
case songs = "results"
}
}
struct TrackResults: Codable {
var trackMatches: TrackMatches
enum CodingKeys: String, CodingKey {
case trackMatches = "trackmatches"
}
}
struct TrackMatches: Codable {
let matches : [Tracks]
enum CodingKeys: String, CodingKey {
case matches = "track"
}
}
struct Tracks: Codable {
let songName: String
let singerName: String
let albumImage: [TrackImage]
enum CodingKeys: String, CodingKey {
case songName = "name"
case singerName = "artist"
case albumImage = "image"
}
}
struct TrackImage: Codable{
let url: String
let size: String
enum CodingKeys: String, CodingKey{
case url = "#text"
case size
}
}
try?
при декодировании внешних данных и/или разработке новых функций. Скорее всего, вы получаете ошибку, но с попыткой? вы игнорируете эту ошибку. Поэтому измените его наdo { let decodedResponse = try JSONDecoder().decode( ... } catch { print(error) }
, чтобы вы могли видеть, что идет не так. - person Joakim Danielson   schedule 24.05.2021