这是一系列短文中的第一篇,会简单介绍些你可能不知道的东西。我也会努力尝试穿插写些更深入的长文。
捕获列表
很多人不知道Swift中可以显式地指定闭包的捕获列表。
闭包封盖了局部环境变量,并为闭包内的代码创建了一个新的执行环境。Objective-C代码块或C#的lambda都是闭包的例子。假如你希望真正了解闭包,执行环境,命名绑定等,我推荐计算机程序的构造和解释和这些过时但极优秀的视频列表。
通过标记self
为unowned或者用weak来打破 retain cycle,这种方法常常用来修改闭包捕获的这个 self 的属性
1 2 3 |
{ [unowned self] in ... } |
苹果官方语言指南要求如果闭包和其捕获的对象相互引用,应该使用unowned
,这样能够保证他们会同时被销毁。这大概是为了避免对象被释放后维护weak
引用空指针的开销。
函数
大部分人没有意识到自己可以创建如下新的命名变量:
1 2 3 |
{ [thing1 = self.grabThing(), weak thing2 = self.something] in ... } |
这避免了引用thing1
和thing2
时污染周围代码。作为加分项,thing2
还是个weak引用。
捕获列表需要尾随in
关键字,并且紧跟着参数列表假如你有需要:
1 2 3 |
{ [unowned self] (a:A, b:B) -> ReturnType in ... } |
元(meta)
这是这篇短文的所有。假如你有任何建议和纠错请告知我。