Присвоение значения входным параметрам в закрытии в Swift 3
У меня есть ошибка, когда я пытаюсь присвоить значение параметру функции, находясь внутри блока завершения, я получаю ошибку, которая гласит: "Выходящие замыкания могут только явно захватывать входные параметры по значению".
Как я мог это исправить? Любой совет очень ценится!
func fetchCurrentUser(user: inout User? ) {
self.fetchUser(withId: AuthProvider.sharedInstance.currentUserId(), completionHandler: {
fetchedUser in
guard let newUser = fetchedUser else { return }
user = newUser // error Here
})
}
2 ответа
Я предлагаю этот рефакторинг:
func fetchCurrentUser(callback: @escaping (User) -> ()) {
self.fetchUser(withId: AuthProvider.sharedInstance.currentUserId(), completionHandler: {
fetchedUser in
guard let newUser = fetchedUser else { return }
callback(newUser)
})
}
или если вы хотите, чтобы fetchCurrentUser был синхронным, вы можете использовать семафоры
Это не будет работать, потому что вы используете обработчик завершения. self.fetchUser
будет (почти) немедленно возвращаться, и обработчик завершения будет выполняться всякий раз, когда фоновая работа (скорее всего, сетевой запрос) завершена.
Ваша функция fetchCurrentUser
звонки self.fetchUser
и затем возвращает, поэтому он вернется до того, как блок завершения будет выполнен.
Вы не можете использовать параметр inout при экранировании замыканий (это то, что вам также сообщает сообщение об ошибке). Экранирующее закрытие - это закрытие, которое будет выполнено после того, как функция, которую вы передадите, вернется.
Вы можете либо переписать свою функцию, чтобы также использовать обработчик завершения, либо изменить свою функцию, чтобы дождаться запуска обработчика завершения, прежде чем завершить функцию fetchCurrentUser. Но для второго подхода, пожалуйста, имейте в виду, что это также заблокирует вызывающую функцию от выполнения чего-либо еще.