zoukankan      html  css  js  c++  java
  • 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全局变量

  • 相关阅读:
    NCD 2019 M. NCD Salary
    NCD 2019 H. Mr. Hamra and his quantum particles
    Codeforces Testing Round #16 C.Skier
    序列自动机(数组)
    Codeforces #640 div4 F~G (构造二连弹)
    NCD 2019 C. Hasan and his lazy students
    欧拉定理,费马小定理
    微信开发
    异常后显示错误页面
    js窗体间传值
  • 原文地址:https://www.cnblogs.com/muzichenyu/p/13882047.html
Copyright © 2011-2022 走看看