如何在一个块之外的swift中创建一个弱指针

use*_*076 18 closures block weak swift

我想像我们在Objective-c中所习惯的一样快速地指向自我

 __weak Something *weakself = self;
Run Code Online (Sandbox Code Playgroud)

我找到人们解释如何在一个街区内使用"弱自我",

    { in [unowned self] ...}
Run Code Online (Sandbox Code Playgroud)

但是我不想在我的块中定义'weakself',我想在块之外定义弱自己

Mar*_*n R 56

只需使用weak关键字定义弱引用:

weak var weakSelf = self
Run Code Online (Sandbox Code Playgroud)

文档:

通过将weak关键字放在属性或变量声明之前来指示弱引用.
...
注意:弱引用必须声明为变量,以指示它们的值可以在运行时更改.弱引用不能声明为常量.


Dun*_*n C 9

对我来说听起来像是在尝试像在Objective-C中一样避免使用块的保留周期,而不是引用self,而是创建一个弱版本:

__weak MyType *weakSelf = self;

void (^aBlock)() = ^void()
{
   [weakSelf doStuff];
}
Run Code Online (Sandbox Code Playgroud)

这不是Swift处理这个问题的方式.

相反,它具有捕获列表的概念,它告诉编译器哪些引用块捕获,以及如何处理它.您应该在Swift编程参考书中搜索"捕获列表"并阅读相关主题.引用这本书:

"如果为类实例的属性分配闭包,并且闭包通过引用实例或其成员来捕获该实例,则将在闭包和实例之间创建一个强引用循环.Swift使用捕获列表来打破这些强大的参考周期.有关更多信息,请参阅闭包的强引用周期."

摘录自:Apple Inc."The Swift Programming Language."iBooks.https://itun.es/us/jEUH0.l

2016年1月4日编辑:

引用Swift书中解释如何创建捕获列表的部分:

定义捕获列表:捕获列表中的每个项目都是弱或无主关键字与对类实例(如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
}
Run Code Online (Sandbox Code Playgroud)

摘录自:Apple Inc."The Swift Programming Language(Swift 2)."iBooks.https://itun.es/us/jEUH0.l