Ошибка типа контекстного закрытия при доступе к файлу класса в swift - PullRequest
0 голосов
/ 26 мая 2018

Я новичок в быстром программировании, я внедрил речь в текст, используя Microsoft Azure, при вызове файла класса я получаю сообщение об ошибке типа " Тип контекстного закрытия" (Данные ?, URLResponse ?, Ошибка?)-> Void 'ожидает 3 аргумента, но 1 использовался в закрывающем теле". Кто-нибудь может помочь мне решить эту ошибку.

    //This is the sample code where i am calling the function in class file
        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)
                    }
//This is the class file where i am getting the error
class TTSHttpRequest {

   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
        }
        let task = URLSession.shared.dataTask(with: request) { (c:Callback) in   //In this line i am getting above mentioned error.
            callback(c)

        }
        task.resume()
    }

}

enter image description here

1 Ответ

0 голосов
/ 26 мая 2018

Как прокомментировал Лео Дабус, вы не можете передать закрытие с одним аргументом (ваше закрытие принимает один аргумент c типа Callback) в качестве параметра, ожидающего закрытия с тремя аргументами.

Это эффект SE-0110 Различают типы функций с одним кортежем и несколькими аргументами .Статус предложения в настоящее время отображается как Отложено , но большинство функциональных возможностей этого предложения уже реализовано и эффективно в Swift 4, и только небольшая часть (включая Обращение к регрессии юзабилити SE-0110 вSwift 4 ) переписан и находится в процессе доработки.

Одним из возможных исправлений будет что-то вроде этого:

class TTSHttpRequest {

    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
        }
        let task = URLSession.shared.dataTask(with: request) { data, response, error in //<- three arguments
            callback((data, response, error)) //<- Call the callback with one tuple.

        }
        task.resume()
    }

}
...