我调用了一个URLSession:
var someVar = "Are you in my scope?"
let task = session.dataTask(with: url, completionHandler: updatePlaces)
其中updatePlaces是一个定义为:
的函数 private func updatePlaces(data: Data?, response: URLResponse?, error: Error?) -> Void
我把它拆分成另一个函数,因为我真的不喜欢把它作为一个大块的代码,我的“updatePlaces”函数作为我原来的session.dataTask中的一个闭包。它似乎在一个功能中做得太多了。我想分开它。
我也可以使用下面的语法创建一个闭包,但我发现这和函数之间没有区别(我理解一个函数是一种特殊类型的闭包,我认为没有区别):
lazy var updatePlaces: (Data?, URLResponse?, Error?) -> Void = {(data, response, error) in
但是,之前您看到我向范围添加了someVar
。使用函数和lazy var,我无权访问someVar
。但是,如果我在session.dataTask中创建了闭包,则会捕获someVar并且我可以根据文档引用它:
闭包可以捕获和存储对任何常量的引用 来自定义它们的上下文中的变量。这被称为 关闭那些常量和变量。 Swift处理所有的 记忆管理为你捕捉。
所以......我有两个具体的问题。
我的函数声明和闭包声明之间是否存在任何差异,只是将它传递给完成处理程序。
如果我没有在其中定义闭包,有没有办法捕获原始函数中的引用?我猜不是。
还有一个更通用的问题:处理这个问题的首选方法是什么?