Swift: закрывающее закрытие захватывает неэкранирующий параметр onCompletion - PullRequest
1 голос
/ 17 января 2020

У меня проблема с моим swift. Я пытаюсь отправить запрос API, а затем получить данные, но получаю следующее сообщение об ошибке:

«Swift: Escaping closure захватывает неэкранирующий параметр onCompletion». Кто-нибудь знает, как я могу решить это? заранее спасибо

код:


class RestApiManager: NSObject {
    static let sharedInstance = RestApiManager()

    let baseURL = "http://api.randomuser.me/"

    func getRandomUser(onCompletion : (JSON) -> Void) {
        makeHTTPGetRequest(path: baseURL, onCompletion: { json, err -> Void in
            onCompletion(json)
        })
    }

    func makeHTTPGetRequest(path: String, onCompletion: ServiceResponse) {
        let request = NSMutableURLRequest(url : URL(string: path)! as URL)

        let session = URLSession.shared

        let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
            let json:JSON = JSON(data as Any)
            onCompletion(json, error as NSError?)
        })
        task.resume()

    }
}

Ответы [ 3 ]

5 голосов
/ 17 января 2020

Вы должны пометить оба обработчика завершения @escaping. Обычно компилятор предлагает исправление

class RestApiManager: NSObject {
    static let sharedInstance = RestApiManager()

    let baseURL = "http://api.randomuser.me/"

    func getRandomUser(onCompletion : @escaping (JSON) -> Void) {
        makeHTTPGetRequest(path: baseURL, onCompletion: { json, err -> Void in
            onCompletion(json)
        })
    }

    func makeHTTPGetRequest(path: String, onCompletion: @escaping ServiceResponse) {
        let request = NSMutableURLRequest(url : URL(string: path)! as URL)

        let session = URLSession.shared

        let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
            let json:JSON = JSON(data as Any)
            onCompletion(json, error as NSError?)
        })
        task.resume()

    }
}
1 голос
/ 17 января 2020

Используйте это:

class RestApiManager: NSObject {
static let sharedInstance = RestApiManager()

let baseURL = "http://api.randomuser.me/"

func getRandomUser(onCompletion : @escaping (JSON) -> Void) {
    makeHTTPGetRequest(path: baseURL, onCompletion: { json, err -> Void in
        onCompletion(json)
    })
}

func makeHTTPGetRequest(path: String, onCompletion: @escaping ServiceResponse) {
    let request = NSMutableURLRequest(url : URL(string: path)! as URL)

    let session = URLSession.shared

    let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
        let json:JSON = JSON(data as Any)
        onCompletion(json, error as NSError?)
    })
    task.resume()

}
}
0 голосов
/ 17 января 2020

Это счастье из-за вашего параметра onCompletion. По умолчанию это @nonesacping, вы должны пометить его как @esacping, чтобы он мог работать при закрытии завершения.

func makeHTTPGetRequest(path: String, onCompletion: @escaping ServiceResponse)
...