命令行应用中异步函数结果未打印,求解决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
相关产品推荐
相关产品推荐

