Если вы собираетесь обернуть асинхронную функцию своей собственной функцией, обычно лучше предоставить вашей функции-обертке также обработчик завершения. Обратите внимание на вызов вашего обработчика завершения. Вот где вы должны передать полученные значения (т. Е. В замыкании):
func getBrightness(characteristic: HMCharacteristic, completion: @escaping (Int?, Error?) -> Void) {
characteristic.readValue { (error) in
//Program flows here second
if error == nil {
completion(characteristic.value as? Int, nil)
} else {
completion(nil, error)
}
}
//Program flows here first
}
Затем, когда вы вызываете свою функцию, вам просто нужно убедиться, что вы обрабатываете результаты в обработчике завершения (то есть закрытии):
getBrightness(characteristic: characteristic) { (value, error) in
//Program flows here second
if error == nil {
if let value = value {
print(value)
}
} else {
print("an error occurred: \(error.debugDescription)")
}
}
//Program flows here first
Всегда имейте в виду, что код будет проходить до завершения асинхронной функции. Поэтому вы должны структурировать свой код так, чтобы все, что зависит от возвращаемого значения или ошибки, не выполнялось до завершения.