2

我有一个 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到范围。使用函数和惰性 var,我无法访问someVar. 但是,如果我在 session.dataTask 中进行关闭,则会捕获 someVar,我可以根据文档引用它:

闭包可以从定义它们的上下文中捕获和存储对任何常量和变量的引用。这被称为关闭这些常量和变量。Swift 为您处理所有捕获的内存管理。

所以...我有两个具体问题。

我的函数声明和我的闭包声明之间是否有任何区别,只是将其传递给完成处理程序。

如果我没有在其中定义闭包,有什么方法可以捕获原始函数中的引用?我猜不是。

还有一个更...一般的问题:处理这个问题的首选方法是什么?

4

0 回答 0