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

命令行应用中异步函数结果未打印,求解决Apple股价获取问题

问题排查与修复

你的代码存在几个关键问题导致无输出,逐一解决如下:

1. 函数未执行

你仅定义了getStockPrice(symbol:)函数,但从未调用它。必须在代码末尾添加调用语句才能触发逻辑:

getStockPrice(symbol: "AAPL")

2. 异步任务导致进程提前退出

URLSession.dataTask是异步执行的,在命令行或Playground环境中,程序会在网络请求完成前就结束进程,因此看不到输出。需要添加等待机制,比如用DispatchGroup:

修改后的完整代码:

import Foundation

func getStockPrice(symbol: String, completion: @escaping () -> Void) {
    let apiKey = "****************"
    // 删除内部覆盖的symbol变量,直接使用函数入参
    let urlString = "https://www.alphavantage.co/query?function=GLOBAL_QUOTE&symbol=\(symbol)&apikey=\(apiKey)"
    
    guard let url = URL(string: urlString) else {
        print("无效URL")
        completion()
        return
    }
    
    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
        defer { completion() } // 请求完成后通知等待
        
        if let error = error {
            print("数据请求错误: \(error.localizedDescription)")
            return
        }
        
        guard let data = data else {
            print("未收到数据")
            return
        }
        
        do {
            let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
            if let globalQuote = json?["Global Quote"] as? [String: Any],
               let price = globalQuote["05. price"] as? String {
                print("\(symbol) 当前股价: \(price)")
            } else {
                print("无法获取股价,建议检查API返回格式")
                // 可打印原始JSON辅助排查
                if let jsonStr = String(data: data, encoding: .utf8) {
                    print("API返回内容: \(jsonStr)")
                }
            }
        } catch {
            print("JSON解析错误: \(error.localizedDescription)")
        }
    }
    
    task.resume()
}

// 用DispatchGroup等待异步任务完成
let group = DispatchGroup()
group.enter()
getStockPrice(symbol: "AAPL") {
    group.leave()
}
group.wait()

3. 多余的变量覆盖

你在函数内部重新定义了let symbol = "AAPL",覆盖了函数入参,导致函数失去通用性,建议删除该内部变量。

额外排查点

  • 确认你的API密钥有效,Alpha Vantage免费密钥有请求次数限制,超出限制会返回错误JSON,可通过打印原始返回内容排查。
  • 检查URL中的转义符:代码里的&应改为&,避免URL解析异常。

内容的提问来源于stack exchange,提问作者QuirckyOrk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:53:28