一、闭包
1.1-闭包表达式
func sum(_ v1:Int,_ v2:Int)->Int{v1+v2}
print(sum(1, 1))
var fn = {
(_ v1:Int, _ v2:Int)->Int in
return v1+v2
}
print(fn(2, 2))
{
(v1:Int,v2:Int) -> Int in
return v1 + v2
}(3,3)
1.2-闭包表达式的简写
func test(a:Int,b:Int,fn:(Int,Int)->Int){
print(fn(a,b))
}
test(a:1,b:2,fn:{(a:Int,b:Int)->Int in return a+b})
test(a:3,b:4,fn:{a,b in return a+b})
test(a:5,b:6,fn:{a,b in a+b})
test(a:7,b:8,fn:{$0+$1})
test(a:9,b:10,fn:+)
})
3
7
11
15
19
1.3-尾随闭包
func test1(a:Int,b:Int,fn:(Int,Int)->Int){print(fn(a,b))}
test1(a:1,b:2){$0+$1}
func test2(fn:(Int,Int)->Int){print(fn(2,2))}
test2(fn:{$0+$1})
test2(){$0+$1}
test2{$0+$1}
3
4
4
4
1.4-闭包使用示例-数组排序
func cmp(a:Int,b:Int)->Bool{
return a>b
}
var array=[3,1,2,5,2,4,6]
array.sort(by:cmp)
print(array)
[6, 5, 4, 3, 2, 2, 1]
array.sort(by:{
(a:Int,b:Int)->Bool in
return a<b
})
print(array) [1, 2, 2, 3, 4, 5, 6]
array.sort(by:{a,b in return a>b})
print(array) [6, 5, 4, 3, 2, 2, 1]
array.sort(by:{a,b in a<b})
print(array) [1, 2, 2, 3, 4, 5, 6]
array.sort(by:{$0>$1})
print(array) [6, 5, 4, 3, 2, 2, 1]
array.sort(by:<)
print(array) [1, 2, 2, 3, 4, 5, 6]
array.sort(){$0>$1}
print(array) [6, 5, 4, 3, 2, 2, 1]
array.sort{$0<$1}
print(array) [1, 2, 2, 3, 4, 5, 6]
1.5-忽略参数
func test(fn:(Int,Int)->Int){
print(fn(1,2))
}
test {_,_ in 1}
1
1.6-自动闭包
func test1(_ a:Int,_ b:Int)->Int{
return a>0 ? a:b
}
print(test1(1,2))
print(test1(-1,2))
print(test1(1,-2))
1
2
1
func test2(_ a:Int,_ b:()->Int)->Int?{
return a > 0 ? a:b()
}
print(test2(-1){2})
Optional(2)
func test3(_ a:Int,_ b:@autoclosure()->Int)->Int?{
return a>0 ? a:b()
}
print(test3(-1,2))
Optional(2)
1.7-闭包和类
typealias Fn = (Int)->Int
func getFn()->Fn{
var num=0
func plus(_ i:Int)->Int{
num+=i
return num
}
return plus
}
var fn1=getFn()
var fn2=getFn()
print(fn1(1))
print(fn2(2))
print(fn1(3))
print(fn2(4))
1
2
4
6
class Test{
var num=0
func plus(_ i:Int)->Int{
num+=i
return num
}
}
var t1=Test()
var t2=Test()
print(t1.plus(1))
print(t2.plus(2))
print(t1.plus(3))
print(t2.plus(4))
1
2
4
6
二、扩展:汇编leaq和movq区别
leaq 0xd(%rip), %rax
movq 0xd(%rip), %rax