SwiftUI MVVM调用Rick and Morty API解码失败问题求助
问题排查与修复
核心问题:解码目标类型不匹配
Rick and Morty API的返回结构是包含info和results字段的顶层对象,对应你定义的Character结构体,但你在ViewModel中错误地直接将响应解码为[Result]数组,这直接导致了解码失败。
修复步骤
1. 修正ViewModel中的解码逻辑
修改getAllCharacters方法里的解码代码,先将响应解码为Character类型,再提取其中的results数组赋值给characters:
if let data = data, let characterResponse = try? decoder.decode(Character.self, from: data) { self?.characters = characterResponse.results } else { self?.hasError = true self?.error = CharacterError.failedToDecode }
2. 简化空值处理(可选但推荐)
你定义的JSONNull类可以用Swift原生可选类型替代,修改Info结构体:
struct Info: Codable { let count, pages: Int let next: String let prev: String? // 替换JSONNull?为String? }
随后删除整个JSONNull类,Codable会自动处理prev字段为null的情况。
为什么教程API能正常工作?
教程中的API返回的是直接的数组结构(比如[User]),所以直接解码数组是正确的;而Rick and Morty API返回的是嵌套结构,必须先解码顶层对象再提取内部数组。
内容的提问来源于stack exchange,提问作者Javi
相关产品推荐
相关产品推荐

