【发布时间】:2021-03-02 16:08:37
【问题描述】:
在尝试解码 JSON 时,我遇到了一个错误:
致命错误:“试试!”表达式意外引发错误: Swift.DecodingError.keyNotFound(CodingKeys(stringValue: "cast", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription:“没有与键关联的值 CodingKeys(stringValue: "cast", intValue: nil) ("cast").", 底层错误:无))
奇怪的是,它并不总是出现,我可以打开MovieDetailsView几次而不会出现错误,但出现的次数更多。可能是什么问题?
数据模型:
struct MovieCreditResponse: Codable {
let cast: [MovieCast]
}
struct MovieCast: Identifiable, Codable {
let id: Int
let character: String
let name: String
let profilePath: String?
}
我在这里获取数据:
class TMDbApi {
//...
func getMovieCredits(movieID: String, completion:@escaping (MovieCreditResponse) -> ()){
guard let url = URL(string: "https://api.themoviedb.org/3/movie/\(movieID)/credits?api_key=<api_key>") else { return }
URLSession.shared.dataTask(with: url) { (data, _, _) in
let movies = try! JSONDecoder().decode(MovieCreditResponse.self, from: data!) //ERROR IS HERE
DispatchQueue.main.async {
completion(movies)
}
}
.resume()
}
}
MovieDetailsView:
struct MovieDetailsView: View {
var movie: Movie
@State var casts: [MovieCast] = []
var body: some View {
VStack{
MoviePosterView(posterPath: movie.posterPath!)
List{
ForEach(casts){ cast in
Text(cast.name)
}
}
}.onAppear{
TMDbApi().getMovieCredits(movieID: movie.id.uuidString){ data in
self.casts = data.cast
}
}
}
}
内容视图:
struct ContentView: View {
@State var movies: [Movie] = []
var body: some View {
NavigationView{
List {
ForEach(movies) { movie in
NavigationLink(destination: MovieDetailsView(movie: movie)){
//...
}
}
}.onAppear(){
TMDbApi().getMovies{ data in
self.movies = data.results
}
//...
}
.navigationTitle("Movies App")
}
}
}
【问题讨论】:
-
如果我不得不猜测,您得到的响应并不总是包含
cast值,并且由于您正在强制尝试(您不应该这样做,您应该处理而是错误),您的应用程序正在崩溃。您是否尝试过查看解码失败时得到的响应? -
另外你应该重新生成你的 API 密钥,因为你已经把它粘贴到这里了。
-
为什么不查看documentation?
-
@JoakimDanielson 我阅读了文档documentation。在我看来我什么都照着做,也许我错了
-
是的,我的错,我错过了你网址的最后一部分,所以我检查了错误的端点。我建议使用
String(data: data, encoding: .utf8)打印数据,看看你真正得到了什么
标签: json swift swiftui urlsession