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

Swift中如何在链式函数执行完成后调用带返回值的完成处理程序?

解决Swift链式函数调用中的完成处理程序传递问题

嘿,我来帮你搞定这个问题!你现在的核心困扰是完成处理程序(completion)没跟着函数调用链传下去,导致最后解析出AQI后没法把值回传给getAirQuality的闭包。咱们直接改代码,一步到位:

修改后的完整代码

func getAirQuality(completion: @escaping (Int?) -> Void) {
    callAPI(completion: completion)
}

private func callAPI(completion: @escaping (Int?) -> Void) {
    // 这里替换成实际的API请求逻辑,比如URLSession调用
    let fetchedData = Data() // 模拟获取到的接口数据
    parseDataForAQI(data: fetchedData, completion: completion)
}

private func parseDataForAQI(data: Data, completion: @escaping (Int?) -> Void) {
    // 这里替换成实际的JSON解析逻辑
    let parsedAQI: Int? = 60 // 模拟解析得到的AQI值
    completion(parsedAQI) // 调用完成处理程序,把结果传回上层
}

关键修改点说明

  • 传递闭包:把getAirQuality里的completion闭包,沿着调用链依次传给callAPI和parseDataForAQI,让每一层函数都能拿到最终要回调的闭包。
  • @escaping标记:因为闭包会在函数返回后才被调用(比如异步网络请求完成后),所以必须给闭包加上@escaping关键字,告诉编译器这个闭包会“逃逸”出当前函数的作用域。
  • 最终回调:在parseDataForAQI里解析出AQI后,直接调用completion(parsedAQI),就能把结果传回最初调用getAirQuality的地方了。

调用示例

现在你就可以像期望的那样调用了:

getAirQuality { aqi in
    if let aqi = aqi {
        print("当前空气质量指数:\(aqi)")
    } else {
        print("获取空气质量数据失败")
    }
}

如果之后还要加更多链式调用的函数(比如再加一个校验AQI合法性的步骤),只需要继续把completion闭包往下传就行,逻辑完全一致~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:58:01