将[unowned self]添加到闭包参数Swift中

时间:2018-03-15 14:33:25

标签: swift closures automatic-ref-counting unowned-references

我有一个带有完成处理程序的函数,返回一个或多个参数。

在客户端,当执行完成处理程序时,我希望unowned引用self,并且可以访问传递的参数。

这是Playground示例,说明了我正在努力实现的问题和目标。

import UIKit

struct Struct {
  func function(completion: (String) -> ()) {
    completion("Boom!")
  }

  func noArgumentsFunction(completion: () -> Void) {
    completion()
  }
}

class Class2 {
  func execute() {
    Struct().noArgumentsFunction { [unowned self] in
      //...
    }

    Struct().function { (string) in // Need [unowned self] here
      //...
    }
  }
}

2 个答案:

答案 0 :(得分:4)

正如我在评论中所说的那样

Struct().function { [unowned self] (string) in 
    //your code here 
}

捕获列表关闭参数应该是关闭中的顺序更多信息来自Apple Documentation

  

定义捕获列表

     

捕获列表中的每个项目都是一对   带有类实例引用的弱或无主关键字(例如   as self)或用某个值初始化的变量(例如delegate =   self.delegate!)。这些配对写在一对正方形内   括号,用逗号分隔。

     

将捕获列表放在闭包的参数列表之前并返回   输入时输入:

lazy var someClosure: (Int, String) -> String = {
    [unowned self, weak delegate = self.delegate!] (index: Int, stringToProcess: String) -> String in
    // closure body goes here 
}
  

如果闭包没有指定参数列表或返回类型,因为   他们可以从中推断出来   上下文,将捕获列表放在关闭的最开始,   后跟in关键字:

lazy var someClosure: () -> String = {
     [unowned self, weak delegate = self.delegate!] in
     // closure body goes here
 }

答案 1 :(得分:1)

它只是在您需要的闭包参数列表中包含[unowned self]的语法吗?

struct Struct {
    func function(completion:(String)->()) {
        completion("Boom!")
    }
}

class Class {
    func execute() {
        Struct().function { [unowned self] string in
            print(string)
            print(self)
        }
    }
}

Class().execute()

enter image description here