线程 4:致命错误:"尝试!"表达式意外引发错误



我正试图学习在swiftUI中进行API调用,我正在遵循下一个教程https://www.youtube.com/watch?v=1en4JyW3XSI,但代码给了我一个错误,我找不到解决方案。

PostList.swift

import SwiftUI
struct PostList: View {

@State var posts: [Post] = []

var body: some View {
List(posts) { post in
Text(post.title)

}
.onAppear(){
Api().getPosts { (posts) in
self.posts = posts
}
}
}
}
struct PostList_Previews: PreviewProvider {
static var previews: some View {
PostList()
}
}

Data.swift

import SwiftUI
struct Post: Codable, Identifiable {
var id = UUID()
var title: String
var body: String
}
class Api{
func getPosts(completition: @escaping([Post]) -> ()){
guard let url = URL(string: "https://jsonplaceholder.typicode.com/posts") else { return }

URLSession.shared.dataTask(with: url) { (data, _, _) in
let posts = try! JSONDecoder().decode([Post].self, from: data!)

DispatchQueue.main.async {
completition(posts)
}

}
.resume()
}
}

我得到的错误是在这里let posts = try! JSONDecoder().decode([Post].self, from: data!),它是下一个:

线程4:致命错误:'try!的表达式意外地引发了一个错误:Swift.DecodingError.typeMismatch (Swift.StringSwift.DecodingError。Context(codingPath: [_JSONKey(stringValue: "Index)0", intValue: 0), CodingKeys(stringValue: "id", intValue: nil)],debugDescription: "期望解码字符串,但找到一个数字而不是。", underlyingError: nil))

我注意到教程中的家伙使用let id = UUID(),但这也给了我一个问题,我被要求将其更改为var id = UUID()

如果这是一个非常简单或愚蠢的问题,我很抱歉,我只是看不到找到解决它的方法。

您可以通过为确切的错误添加try - catch块来查看确切的问题。

这样的

URLSession.shared.dataTask(with: url) { (data, _, _) in
do {
let posts = try JSONDecoder().decode([Post].self, from: data!)

DispatchQueue.main.async {
completition(posts)
}

} catch {
print(error.localizedDescription)
}
}

现在打印错误:

数据无法读取,因为它不是正确的格式。

这意味着你正在解码错误的类型

问题在这里

struct Post: Codable, Identifiable {
var id = UUID() //< Here

这里的json id有Int类型,你正在使用UUID类型。

将数据类型UUID改为Int。这样的

struct Post: Codable, Identifiable {
var id : Int //< Here

最新更新