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
相关产品推荐
相关产品推荐

