Как установить возвращаемое значение закрывающей функции в переменную? - PullRequest
0 голосов
/ 31 августа 2018

У меня есть функция закрытия, которая загружает и возвращает данные с веб-сервера. Следующий код напечатает значение, которое я хочу.

  loadData1(onCompletion: { (json) in
     print(json)
  })

Моя проблема в том, что мне нужно установить напечатанное значение равным переменной, чтобы использовать ее вне функции. Я пробовал это:

  let x = loadData1(onCompletion: { (json) in
     return json
  })

но я получаю предупреждение "Константа x" подразумевает наличие типа '()', что может быть неожиданно ", а значение x равно" () ". Для справки тип json: [[String: String]].

Edit: В настоящее время есть это

var x = [[String: String]]()
override func viewDidLoad() {
    super.viewDidLoad()
    loadData1(onCompletion: { (json) in
        self.x = json
    })
    print(x)
}

и печатается "[]".

Ответы [ 3 ]

0 голосов
/ 31 августа 2018
    var x = [[String: String]]()

    func loadData1(onCompletion: @escaping ([[String: String]]) -> ())
    {
        //do your stuff here and assume you get your data
        let data = [["key": "str"]]
        //then call completion callback
        onCompletion(data)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        loadData1(onCompletion: { json in
            self.x = json
            print(self.x)
        })

        //if you print here can not make sure you finished loadData1() because it is a async call.
    }
0 голосов
/ 31 августа 2018

Похоже, что замыкание, которое вы пытаетесь использовать, работает в асинхронной функции (которую можно догадаться по имени параметра onCompletion). Это означает, что print(x) выполняется до вызова вашего обработчика завершения, поэтому значение json еще не назначено. Для очень быстрого исправления вы можете переместить print(x) внутрь.

loadData1(onCompletion: { (json) in
    self.x = json
    print(self.x) // Now you guaranteed to have the value assigned to x before printing
})
0 голосов
/ 31 августа 2018

Попробуйте установить значение переменной x внутри замыкания:

loadData1(onCompletion: { (json) in
     x = json
})

В вашем подходе переменная x инициализирована закрытием, поэтому вы получили предупреждение.

Пока не будет выполнено закрытие, переменная x будет иметь значение по умолчанию var x = [[String: String]]() или остаться неразрешенным, если вы не указали значение по умолчанию вместе с объявлением.

...