Swift之闭包初体验

闭包的定义

一个函数和它所捕获的变量\常量环境组合起来,称为闭包 我们也可以将其分解成两部分: 1) 定义在函数内部的函数 2) 它捕获的是外层函数的局部变量

对于下面的代码:
typealias Fn = (Int) -> Int
var num = 0
func getFn() -> Fn {
//    var num = 0
    func plus(_ i: Int) -> Int {
        num += i
        return num
    }
    return plus
}

var fn = getFn()
print(fn(1)) //1
print(fn(2)) //3
print(fn(3)) //6
print(fn(4)) //10

其实对于上面的代码无需太多的解释,num是一个全局变量,只分配一份,相当于执行1、2、3、4的累加,对于内存的打印如下所示:

如果把代码num变为getFn内部的成员变量,代码如下:

typealias Fn = (Int) -> Int
//var num = 0
func getFn() -> Fn {
    var num = 0
    func plus(_ i: Int) -> Int {
        num += i
        return num
    }
    return plus
}

var fn = getFn()
print(fn(1)) //1
print(fn(2)) //3
print(fn(3)) //6
print(fn(4)) //10

内存的打印如下:

x/5xg 0x000000010061aa20
0x10061aa20: 0x0000000100004028 0x0000000200000002
0x10061aa30: 0x0000000000000001 0x00007fff2f3297f1
0x10061aa40: 0x000000004d55545a
3
(lldb) x/5xg 0x000000010061aa20
0x10061aa20: 0x0000000100004028 0x0000000200000002
0x10061aa30: 0x0000000000000003 0x00007fff2f3297f1
0x10061aa40: 0x000000004d55545a
6
(lldb) x/5xg 0x000000010061aa20
0x10061aa20: 0x0000000100004028 0x0000000200000002
0x10061aa30: 0x0000000000000006 0x00007fff2f3297f1
0x10061aa40: 0x000000004d55545a

可以从上面的汇编代码中看出,swift_allocObject相对应num在堆空间的地址,相当于num仅分配一份,所以等价于num全局变量

posted @ 2020-10-26 23:08  木子沉雨  阅读(64)  评论(0编辑  收藏  举报