在 Swift 3 中的闭包内为 inout 参数赋值

Assigning value to inout parameters within closure in Swift 3

当我尝试在完成块内为函数参数赋值时出现错误,我收到一条错误消息 'escaping closures can only capture inout parameters explicitly by value' 。

我该如何解决这个问题?非常感谢任何提示!

func fetchCurrentUser(user: inout User? ) {
    self.fetchUser(withId: AuthProvider.sharedInstance.currentUserId(), completionHandler: {
        fetchedUser in
        guard let newUser = fetchedUser else { return }
        user = newUser // error Here
    })
}

这将不起作用,因为您使用了完成处理程序。 self.fetchUser 将(几乎)立即 return 并且只要后台工作(很可能是网络请求)完成,就会执行完成处理程序。

您的函数 fetchCurrentUser 调用 self.fetchUser 而不是 return,因此它会 return 在完成块执行之前。

您不能在转义闭包时使用 inout 参数(错误消息也告诉您)。转义闭包是一个闭包,它将在您在 returns.

中传递给它的函数之后执行。

您可以重写您的函数以也使用完成处理程序或将您的函数更改为等待完成处理程序 运行 在结束 fetchCurrentUser 函数之前。但对于第二种方法,请注意这也会阻止函数的调用者执行任何其他操作。

我建议重构:

func fetchCurrentUser(callback: @escaping (User) -> ()) {
    self.fetchUser(withId: AuthProvider.sharedInstance.currentUserId(), completionHandler: {
        fetchedUser in
        guard let newUser = fetchedUser else { return }
        callback(newUser)
    })
}

或者如果您希望 fetchCurrentUser 同步,您可以使用信号量