• 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全局变量

  • 相关阅读:
    MySQL——视图/触发器/事务/存储过程/函数/流程控制
    python连接MySQL/redis/mongoDB数据库的简单整理
    docker安装和使用
    【Python】Django2.0集成Celery4.1详解
    django-haystack全文检索详细教程
    ubuntu16.04安装FastDFS-5.08
    redis之django-redis
    uva 1152 4 Values whose Sum is 0
    2015暑假acm短训小结
    Uva 12569 Planning mobile robot on Tree (EASY Version)
  • 原文地址:https://www.cnblogs.com/muzichenyu/p/13882047.html
Copyright © 2020-2023  润新知