延时加载或延时初始化是一种在 iOS 中优化方案
OC 中:
保证初始化一次,节省内存分配和运行时耗费时间
1
2
3
4
5
6
7
8
9
| - (UILabel *)tipLb {
if (!_tipLb) {
_tipLb = [[UILabel alloc] init];
_tipLb.textAlignment = NSTextAlignmentCenter;
_tipLb.textColor = [UIColor whiteColor];
_tipLb.backgroundColor = [UIColor clearColor];
}
return _tipLb;
}
|
swift 中:
1
2
3
4
5
6
7
| private lazy var tipLb: UILabel = {
let lb = UILabel()
lb.backgroundColor = UIColor.clear
lb.textColor = UIColor.white
lb.textAlignment = NSTextAlignment.center
return lb
}()
|
lazy 也可以配合像 map 或是 filter ,让整个行为变成延时进行,对性能提升会有些帮助
1
2
3
4
5
6
7
8
9
10
11
12
13
| let data = 1...3
let result = data.map {
(i: Int) -> Int in
print("正在处理 \(i)")
return i * 2
}
print("准备访问结果")
for i in result {
print("操作后结果为 \(i)")
}
print("操作完毕")
|
1
2
3
4
5
6
7
8
| // 正在处理 1
// 正在处理 2
// 正在处理 3
// 准备访问结果
// 操作后结果为 2
// 操作后结果为 4
// 操作后结果为 6
// 操作完毕
|
1
2
3
4
5
6
7
8
9
10
11
12
13
| let data = 1...3
let result = data.lazy.map {
(i: Int) -> Int in
print("正在处理 \(i)")
return i * 2
}
print("准备访问结果")
for i in result {
print("操作后结果为 \(i)")
}
print("操作完毕")
|
1
2
3
4
5
6
7
8
| // 准备访问结果
// 正在处理 1
// 操作后结果为 2
// 正在处理 2
// 操作后结果为 4
// 正在处理 3
// 操作后结果为 6
// 操作完毕
|
示例项目中
1
2
3
4
5
6
| let s = l.lazy.filter { $0.questionNumber ?? 0 > 0 }.sorted { (t1, t2) -> Bool in
if let t11 = t1.questionNumber, let t22 = t2.questionNumber {
return t11 < t22
}
return false
}
|
当然也可以通过嵌套方法和 通过闭包函数作为参数传入 等同于 ==
1
2
3
4
5
6
7
8
9
10
| func test () {
func sortedQuestion(_ s1: StudentQuestionMetaList, s2: StudentQuestionMetaList) -> Bool {
if let t11 = s1.questionNumber, let t22 = s2.questionNumber {
return t11 < t22
}
return false
}
let s = l.lazy.filter { $0.questionNumber ?? 0 > 0 }.sorted(by: sortedQuestion)
}
|
是代码结构清晰