闭包
闭包和OC中的Block非常相似,OC中的block类似于匿名函数,闭包是用来定义函数,他们的作用都是 保存一段代码,在需要的时候执行。
// oc 中的block
void (^myblock)(int a,int b);
myblock = ^(int a,int b){
// ...
}
// swift 闭包
{
(参数) -> 返回值类型
in
执行语句
}
{
(parameters) -> returnType
in
statements
}
闭包简化 - 尾随闭包
func someFunctionThatTakesAClosure(closure: () -> Void) {
// 函数体部分
}
// 以下是不使用尾随闭包进行函数调用
someFunctionThatTakesAClosure({
// 闭包主体部分
})
// 以下是使用尾随闭包进行函数调用
someFunctionThatTakesAClosure() {
// 闭包主体部分
}
someFunctionThatTakesAClosure{ () -> Void in
// 闭包主体部分
}
1.如果没有参数, 没有返回值, in和in之前的东西可以省略
2.如果闭包是函数的最后一个参数, 可以写在()后面 -- 尾随闭包
3.如果只有一个闭包参数, 那么()也可以省略 -- 尾随闭包
懒加载
lazy var table: UILabel = {
return UILabel()
}()
var bb:(() -> UILabel) = {() -> UILabel in
return UILabel()
}
lazy var nihao:UILabel = self.bb()
lazy var nihaohao:UILabel = {() -> UILabel in
return UILabel()
}()
- 需要的时候初始化内存,对内存开销较小,节省内部资源
- 代码初始化放在一起,代码块比较好划分,方便别人和自己阅读
import UIKit
class ViewController: UIViewController {
// Swift中的懒加载会在第一个访问的时候执行
// 懒加载其实就是一个提前准备好的的闭包
lazy var dataList: [String] = {
print("我懒加载了")
return ["zj", "hq", "wl"]
}()
let demoFunc = {
() -> [String]
in
print("我懒加载了")
return ["ny", "ny1", "ny2"]
}
// 注意懒加载一定要用var
lazy var dataList2: [String] = self.demoFunc()
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
print(dataList)
print(dataList)
print(demoFunc())
print(dataList2)
print(dataList2)
}
}
打印结果:
我懒加载了
["zj", "hq", "wl"]
["zj", "hq", "wl"]
我懒加载了
["ny", "ny1", "ny2"]
我懒加载了
["ny", "ny1", "ny2"]
["ny", "ny1", "ny2"]
懒加载格式:
lazy var 变量: 类型 = { 创建变量代码 }()