Функция обратного вызова в Swift для возврата значения во время JSON задачи - PullRequest
0 голосов
/ 26 февраля 2020

Я задал этот вопрос, который был закрыт вчера, и мне предоставили аналогичный вопрос о том, как реализовать обратный вызов. Я все еще борюсь с этим и обновил свой код, чтобы попытаться использовать его, но мне кажется, что я сталкиваюсь с множеством проблем. Все, что я пытаюсь сделать, это вернуть значение результатов как Array, чтобы я мог легко манипулировать им позже. Есть ли лучший / более простой способ сделать то, что я пытаюсь выполнить sh?

Функция берет параметр массива из предыдущего представления и использует некоторые значения для вывода pu sh в конечную точку. Результирующий. JSON - это то, что я пытаюсь получить как массив. Текущая ошибка, конечно, результаты не определены при вызове в ViewDidLoad

EDIT : результаты выглядят следующим образом:

["BRLBGN": 0.4699, "BGNBRL": 2.1691]

In ViewDidLoad :

calculateRate(value: codesToConvert, completionHandler: results)

В функции :

func calculateRate(value: [String], completionHandler: (_ results: [String: Any])->()){

    let url = URL(string: "domain.com")!
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    let postString = "pairs=\(value[0] + value[2])&pairs=\(value[2]+value[0])"
    print(postString)
    request.httpBody = postString.data(using: String.Encoding.utf8)

    let task = URLSession.shared.dataTask(with: request) {(data, response, error) in
        do  {
            let jsonResult = try  JSONSerialization.jsonObject(with: data!)
            let results = jsonResult as! [String: Any]
            completionHandler(results)

        } catch {
            print(error)
        }
    }
    task.resume()
}

1 Ответ

1 голос
/ 26 февраля 2020

Предполагая, что вы получаете правильный результат в методе calculateRate, вызовите метод calculateRate(value:completionHandler:) примерно так:

var arrayResults = [String:Any]()

calculateRate(value: ["a", "b", "c"]) {(results) in
    arrayResults = results
}

completionHandler - это замыкание . Таким образом, при вызове calculateRate вам нужно передать замыкание , там принимает параметр results типа [String:Any].

Редактировать:

Также добавьте @escaping с completionHandler в подписи calculateRate(value:completionHandler:) метода.

func calculateRate(value: [String], completionHandler: @escaping (_ results: [String: Any])->()){
    //rest of the code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...