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

  • 相关阅读:
    MarkDown使用教程
    B+树详解
    B-树(B树)详解
    SQL优化之limit 1
    mysql explain用法和结果的含义
    MySQL 常用内置函数与所有内置函数
    Mac os 相关查找命令
    数据库——自然连接、内连接、外连接(左外连接、右外连接,全连接)、交叉连接
    sql语句执行顺序
    有三个线程,怎么让他们按顺序执行?
  • 原文地址:https://www.cnblogs.com/muzichenyu/p/13882047.html
Copyright © 2020-2023  润新知