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

时间:2017-06-02 00:23:39

标签: swift closures completionhandler inout

当我在完成块内部尝试为函数参数赋值时发生错误,我得到一个错误,上面写着'转义闭包只能通过值显式捕获inout参数'。

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

-- f and foldr have to return the same type!
foldr f v (x:xs) = f x (foldr f v xs)

2 个答案:

答案 0 :(得分:2)

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

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

你不能在转义闭包时使用inout参数(这也是错误信息也告诉你的)。转义闭包是一个闭包,它将在你传递它的函数之后执行。

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

答案 1 :(得分:1)

我建议使用这个重构:

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

或者如果你想让fetchCurrentUser同步,你可以使用信号量