1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
func logIfTrue(predicate: () -> Bool) {
if predicate() {
print("true")
}
}
logIfTrue { () -> Bool in
2 > 1
}
logIfTrue { 2 > 1 }
func logIfTrueTwo(_ predicate: @autoclosure () -> Bool) {
if predicate() {
print("true")
}
}
logIfTrueTwo(2 < 1)
和java中lambda很相似,so 语言是相通的
使用 @ autoclosure 和不使用的区别:如果不使用autoclosure,那当我们调用时,我们就必须准备好一个默认值传入到这个方法中,常规情况下无恙,但是当进行大量计算的情况下就浪费性能。
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
func getName() -> String {
print(#function)
return "DKJone"
}
func goodAfternoon(afternoon: Bool, who: String) {
if afternoon {
print("Good afternoon, \(who)")
}
}
func goodMorning(morning: Bool, who: @autoclosure () -> String) {
if morning {
print("Good morning, \(who())")
}
}
print("------goodAfternoon(afternoon: true, who: getName())-------")
goodAfternoon(afternoon: true, who: getName())
print("------goodAfternoon(afternoon: false, who: getName())-------")
goodAfternoon(afternoon: false, who: getName())
print("------goodMorning(morning: false, who: getName())-------")
goodMorning(morning: false, who: getName())
/**
------goodAfternoon(afternoon: true, who: getName())-------
getName()
Good afternoon, DKJone
------goodAfternoon(afternoon: false, who: getName())-------
getName()
------goodMorning(morning: false, who: getName())-------
*/