Swift-懒加载(lazy)

懒加载:通俗来讲就是需要的时候才需要加载(创建)。怎么理解呢?比如一个数组或者一个控件,类init的时候根本不要对他们进行初始化or创建,我们需要使用的时候再初始化or创建,那么起到延迟作用了。也避免了类初始化的时候就要加载他们,减少内存不必要的开支

懒加载OC&Swift的区别

1
2
3
4
5
6
7
8
@property (nonatomic, strong) NSArray *array

- (NSArray *)array{
if (_array == nil){
_array = @[];
}
return _array;
}
1
2
3
lazy var array: [String] = {
return []
}()

lazy格式

格式:定义变量时前面使用lazy来修饰变量,后面通过等号赋值一个闭包,如果不知道闭包是什么,请看Swift-闭包

应用场景:

  • 延迟对象的创建
  • 当属性的值依赖其他未知类

注意点:

  1. 必须使用var声明变量,不能使用let(因为属性的值在实例构造完成之前可能无法得到,而常量属性在构造过程完成之前必须有初始值,因此无法声明成延迟属性)
  2. 闭包后面必须跟上()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// 格式
lazy var `property name`: `type name` = {
`statements`
return `value`
}

// 例子
lazy var array: [String] = {
() -> [String]
in
print("数组被创建了")
return ["1","2","3"]
}()

lazy var array: [String] = {
print("数组被创建了")
return ["1","2","3"]
}()

// 如果闭包用于懒加载,那么in之前的代码都可以删除包括in在内

lazy var label: UILabel = {
let label = UILabel()
label.text = "daisuke"
label.textColor = UIColor.red
label.textAlignment = NSTextAlignment.center
return label
}()

// 也可以简写成这样
let labelClosures = {
() -> UILabel
in
let label = UILabel()
label.text = "daisuke"
label.textColor = UIColor.red
label.textAlignment = NSTextAlignment.center
return label
}

lazy var label: UILabel = self.labelClosures()