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

Swift调用Azure语音转文本类文件时遇上下文闭包类型错误求解决

解决Swift中Azure语音转文本的闭包参数不匹配问题

嘿,我懂你作为Swift新手碰到这个闭包错误的头疼之处!咱们先把问题根源拆解清楚,再一步步修复代码。

错误原因

你遇到的这个报错,核心问题是URLSession的dataTask闭包签名和你自定义的Callback元组不兼容:

  • 系统自带的dataTask(with:completionHandler:)要求闭包接收三个独立参数:Data?、URLResponse?、Error?
  • 但你试图直接把这三个参数打包成一个Callback元组来接收,这就导致了参数数量不匹配的冲突。

修复方案

我们只需要调整TTSHttpRequest类里的submit方法,让它既适配系统闭包的参数格式,又能保留你自定义的Callback元组来传递结果。

修改后的TTSHttpRequest类代码

class TTSHttpRequest {
    // 保留你自定义的Callback元组类型
    typealias Callback = (data: Data?, response: URLResponse?, error: Error?)
    
    static func submit(withUrl url: String, 
                       andHeaders headers: [String: String]? = nil, 
                       andBody body: Data? = nil, 
                       _ callback: @escaping (Callback) -> ()) {
        guard let url = URL(string: url) else { return }
        
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        
        headers?.forEach({ (header: (key: String, value: String)) in
            request.setValue(header.value, forHTTPHeaderField: header.key)
        })
        
        if let body = body {
            request.httpBody = body
        }
        
        // 关键修复:先接收系统闭包的三个独立参数,再打包成Callback元组
        let task = URLSession.shared.dataTask(with: request) { data, response, error in
            // 将三个参数组装成你定义的Callback元组
            let callbackResult = Callback(data: data, response: response, error: error)
            callback(callbackResult)
        }
        task.resume()
    }
}

调用代码(可保持原写法,和修改后的类兼容)

// 调用submit方法的代码无需改动,因为我们已经在类内部适配了Callback格式
TTSHttpRequest.submit(withUrl: TTSSynthesizer.ttsServiceUri, 
                      andHeaders: [
                          "Content-Type": "application/ssml+xml",
                          "X-Microsoft-OutputFormat": outputFormat.rawValue,
                          "Authorization": "Bearer " + accessToken,
                          "X-Search-AppId": appId,
                          "X-Search-ClientID": clientId,
                          "User-Agent": "TTSiOS",
                          "Accept": "*/*",
                          "content-length": "\(message.lengthOfBytes(using: encoding))"
                      ], 
                      andBody: message.data(using: encoding)) { (c: TTSHttpRequest.Callback) in
    guard let data = c.data else { return }
    callback(data)
}

修复逻辑说明

  • 先遵循系统API的要求,接收三个独立的参数
  • 再把这些参数打包成你自定义的Callback元组,这样既满足了系统闭包的签名要求,又能按照你原本的设计传递结果。

这样修改后,那个闭包参数数量不匹配的错误就会消失啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:56:05