我正试图学习在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