Xcode 14中如何将API响应打印到控制台?
API响应无法打印的问题修复
核心问题分析
解码类型不匹配
目标API返回的是帖子对象数组,但你的代码尝试解码为单个Posts对象,这会触发解码错误,若在命令行环境下,程序可能还没打印错误就已退出。异步任务未完成程序已退出
在Swift命令行工具中,URLSession的网络任务是异步执行的,主线程调用fetch()后会直接结束,导致网络任务还没执行完,程序就终止了,所以看不到任何输出。
修复后的代码
import Foundation // 结构体名改为单数,对应单个帖子对象 struct Post: Codable { let userId: Int let id: Int let title: String let body: String } func fetch() { guard let url = URL(string: "https://jsonplaceholder.typicode.com/posts") else { print("无效的请求URL") return } // 使用DispatchGroup等待异步任务完成(仅命令行环境需要) let taskGroup = DispatchGroup() taskGroup.enter() let task = URLSession.shared.dataTask(with: url) { data, response, error in // 任务结束后标记group完成 defer { taskGroup.leave() } // 处理请求错误 if let error = error { print("请求失败:\(error.localizedDescription)") return } // 校验数据是否存在 guard let responseData = data else { print("未获取到响应数据") return } do { // 解码为帖子数组类型[Post] let posts = try JSONDecoder().decode([Post].self, from: responseData) print("成功获取到\(posts.count)条帖子:") // 打印部分内容便于查看 for post in posts.prefix(3) { print("ID: \(post.id) | 标题: \(post.title)") } } catch { print("数据解码失败:\(error)") } } task.resume() // 等待异步任务执行完毕,避免程序提前退出 taskGroup.wait() } fetch()
关键修改说明
- 结构体命名调整为
Post,符合单个数据模型的命名规范,解码时使用[Post].self匹配API返回的数组格式。 - 添加
DispatchGroup来同步异步任务,确保网络请求完成后程序才退出(仅命令行环境需要,iOS/macOS应用无需此操作)。 - 增强错误处理逻辑,打印具体错误信息,便于快速定位问题。
内容的提问来源于stack exchange,提问作者User534t
相关产品推荐
相关产品推荐

