You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xcode 14中如何将API响应打印到控制台?

API响应无法打印的问题修复

核心问题分析

  1. 解码类型不匹配
    目标API返回的是帖子对象数组,但你的代码尝试解码为单个Posts对象,这会触发解码错误,若在命令行环境下,程序可能还没打印错误就已退出。

  2. 异步任务未完成程序已退出
    在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 15:10:25