2

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

在客户端中,当执行完成处理程序时,我希望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
      //...
    }
  }
}
4

2 回答 2

5

正如我在评论中所说

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

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

定义捕获列表

捕获列表中的每一项都是weak 或unowned 关键字与对类实例的引用(例如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
 }
于 2018-03-15T14:40:02.100 回答
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()

在此处输入图像描述

于 2018-03-15T14:38:27.733 回答