捕获列表和函数在swift中作为参数传递

时间:2016-08-19 15:35:14

标签: swift

我有这个原型的功能:

func myFunction(completionHandler:((response:[NSString:AnyObject])->Void)?))

completionHandler原型可以作为闭包或作为函数传递...将其作为闭包传递我知道如何使用此语法[weak self]定义捕获列表,但是如何定义捕获如果不是直接在函数参数中定义闭包而不是我要传递一个函数名?

myFunction(anotherFunction) // how to set capture list from here?

VS

myFunction{ 
     [weak self] (response) in

}

```

编辑-----

一种可能的解决方案是将功能代码包装到一个块中,设置捕获列表并执行块...但听起来很奇怪:/

myFunction(anotherFunction) // how to set capture list from here?
.
.
.
func anotherFunction(response:[NSString:AnyObject]) { 
    let safeBlock = { 
       [weak self] in { 
         self?.callSomethingSafely()
       }
    }

    safeBlock()
}

2 个答案:

答案 0 :(得分:3)

编辑(基于以下Hamish的修正):

我不知道强制引用方法在内部使用捕获变量的弱版本的方法。正如您在示例中所做的那样,实际的方法实现是否可以实现。

但是,值得注意的是,除非您要无限期地存储对该完成处理程序的引用,否则您不必担心自我弱。

我假设一旦myFunction启动的某个异步任务完成,就会调用完成处理程序。在这种情况下,完成处理程序捕获的任何引用只会在完成处理程序运行之前保留。然后这些参考文献将被释放,并且不会有任何保留周期。如果" self"保留关闭和关闭捕获" self",建立循环引用/保留循环。

答案 1 :(得分:0)

@ MatterGoal您的解决方案仍会产生参考周期。

我假设你知道我们应该使用捕获列表的情况。对于myFunction(anotherFunction)这样的场景,我们无法为名为func的方法(anotherFunction)定义捕获列表。至少现在,让我们希望将来能够。

我们只能为闭包定义一个捕获。方法可以充当具有相同签名的闭包,但它(方法)不支持自身的捕获列表。

解决方案:

  1. 制作一个lazy var anotherFunction = { },我们可以在其中定义捕获列表。
  2. 让你的函数返回一个闭包:

    func anotherFunction() -> (() -> Void) {
        return { [weak self] in
            // do anything you want with self? properties or methods.
            // this won't create a strong reference cycle
        }
    }