网站首页 全球最实用的IT互联网站!

人工智能P2P分享Wind搜索发布信息网站地图标签大全

当前位置:诺佳网 > 软件工程 > 后端开发 > Swift >

swift 闭包本质,闭包表达式,尾随闭包

时间:2022-03-16 09:57

人气:

作者:admin

标签:

导读:1. 闭包 一个函数和它所捕获的变量/常量环境组合起来,称为闭包 一般指定义在函数内部的函数 一般它所捕获的是外层函数的局部变量/常量 typealias fn = (Int) -gt; Int func getFn() -gt; fn{ var...

1. 闭包

  • 一个函数和它所捕获的变量/常量环境组合起来,称为闭包

    • 一般指定义在函数内部的函数
    • 一般它所捕获的是外层函数的局部变量/常量
    typealias fn = (Int) -> Int
    func getFn() -> fn{
    	var count = 0
    		func sum(_ i: Int) -> Int{
        		count += i
        		return count
    		}
    	return sum
    }
    
    var f1 = getFn()
    
    f1(1)
    f1(1)
    f1(1)
    f1(1)
    

    结果:
    image
    解释:
    闭包能够使用其外层函数的局部变量,所以函数值能够增加
    本质:
    编译器给sum函数外层getFn函数的count属性分配了堆空间,所以count变量不会在getFn函数执行完后销毁,因此sum函数能够对其进行访问
    分配内存结构: 类似于给class分配的堆空间结构
    image

    • 可以把闭包想象成一个对象的实例

      • 内存在堆空间
      • 捕获的局部变量/常量就是对象的成员
      • 组成闭包的函数就是类内部定义的方法
        类似与class的形式:
      class Closure{
      var count = 0
      	func sum(_ i:Int) -> Int{
      		count += i
      		return count
      	}
      }
      
      var c1 = Closure()
      c1.sum(1)
      c1.sum(1)
      c1.sum(1)
      

2. 闭包表达式

  • 语法:
    {
    	(参数列表) -> 返回值类型 in
    	函数体代码
    }
    
  • 简写:
    func exec(v1:Int, v2:Int, fn:(Int, Int) -> Int){
    	print(fn(v1, v2))
    }
    // 完整写法:
    exec(v1:10, v2:20, fn:{
    	(a1:Int, a2:Int) -> Int in
    	return a1 + a2
    })
    // 简写1
    exec(v1:10, v2:20, fn:{
    	a1, a2 in return a1 + a2
    })
    // 简写2
    exec(v1:10, v2:20,fn:{
    	a1,a2 in a1 + a2
    })
    // 简写3
    exec(v1:10, v2:20, fn:{ $0 + $1 })
    // 简写4
    exec(v1:10, v2:20, fn: + )
    // 尾随闭包: 是一个被书写在函数调用括号外面(后面)的闭包表达式
    // 如果一个很长的闭包表达式作为一个函数的 最后一个 实参,使用尾随闭包可以增强程序的可读性
    exec(v1:10, v2:20){ $0 + $1 }
    // 如果函数只有一个参数,且类型是函数类型,可以省略括号
    func add(fn: (Int,Int) -> Int){
    	print(fn(1, 2))
    }
    add{ $0 + $1 }
    // 省略参数
    add{ _,_ in 10 }  //省略掉参数,固定返回10
    
温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
  • iOS 17新特性以及适配细节汇总

    iOS 17新特性以及适配细节汇总

    1、UIScrollView增加了属性allowsKeyboardScrolling表示是否根据连接的物理键盘的方向键...
  • 最近几天

    最近几天

    8.03周四 一大早电话吵醒,着急给我妈送卡,早上坐车去延安,顺便下来玩玩,...
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信