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

这篇具有很好参考价值的文章主要介绍了swift 闭包本质,闭包表达式,尾随闭包。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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)
    

    结果:
    swift 闭包本质,闭包表达式,尾随闭包
    解释:
    闭包能够使用其外层函数的局部变量,所以函数值能够增加
    本质:
    编译器给sum函数外层getFn函数的count属性分配了堆空间,所以count变量不会在getFn函数执行完后销毁,因此sum函数能够对其进行访问
    分配内存结构: 类似于给class分配的堆空间结构
    swift 闭包本质,闭包表达式,尾随闭包文章来源地址https://www.toymoban.com/news/detail-807427.html

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

      • 内存在堆空间
      • 捕获的局部变量/常量就是对象的成员
      • 组成闭包的函数就是类内部定义的方法
        类似与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
    

到了这里,关于swift 闭包本质,闭包表达式,尾随闭包的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 记录一个正则表达式

    至少 8 个字符; 至少包含一个小写英文字母; 至少包含一个大写英文字母; 至少包含一个数字; 至少包含一个特殊字符,特殊字符为:“!@#$%^*()-+” 中的一个; 不包含2个连续相同的字符; 不包含连续数字,如:12345;

    2024年02月13日
    浏览(41)
  • 【C++】STL 算法 ② ( foreach 循环中传入 函数对象 / Lambda 表达式处理元素 | foreach 循环算法 | Lambda 表达式 - 匿名 函数对象 / 仿函数 )

    在 C++ 语言中 , std::foreach 循环 虽然 不是标准库的一部分 , 但是 C ++ 编译器 提供了对 该语法 的支持作为扩展 ; 使用 该 std::foreach 循环 , 可以用于 遍历 STL 标准模板库 中提供的容器 , 如 vector 单端数组 , list 双向链表 , map 映射 , set 集合 等 容器 中的元素 ; std::for_each 是一个算

    2024年02月02日
    浏览(66)
  • js 函数声明和函数表达式的执行结果

    参考:https://juejin.cn/post/7237051958993469496 推荐:看 《你不知道的 JavaScript》,里面有详细的 js 执行细节,看完很有收获。

    2024年02月08日
    浏览(43)
  • C++的lambda表达式(匿名函数)

    从C++11开始,C++也支持使用lambda表达式(匿名函数)。Lambda表达式是一种便捷的方式,可以定义一个函数对象,而无需使用显式的函数对象类型或函数指针语法。 C++中的 lambda表达式的基本语法如下: 其中各个部分的含义如下: capture list :用于指定所捕获的外部变量列表。可

    2024年02月08日
    浏览(47)
  • 04、Oracle转换函数和条件表达式

    隐式转换: 数据类型与默认格式匹配 1.1.3.1带有日期的 TO_CHAR 双引号:格式中字符串不是格式掩码时 FM : 去除开头和结尾的空格 ( 显示紧凑 ) 都可以用 格式模型:日期格式掩码 官方文档位置: SQL Language Reference - 5 Functions - CTRL+F 搜索 to_char - TO_CHAR (datetime) - Format Models - Table

    2023年04月16日
    浏览(50)
  • 【SQL篇】窗口函数和公共表达式

    思路 先给每个数进行排名 用这些数减去自己的排名,如果减了之后的结果是一样的,说明这几个数是连续的 用logid减去排名得出来的数进行group by,也就是把连续的数全都放在一个一个小组里面,求出每个小组的最大值和最小值就可以了 1596题 总结 这里有个坑,count并不会根

    2024年02月02日
    浏览(40)
  • 一、Lamdba 表达式与函数式接口

    1.1.1 Lambda 表达式概述 Lambda 表达式是 Java 8 引入的一个新特性 Lambda 表达式可以被视为匿名函数 允许在需要函数的地方以更简洁的方法定义功能 Lambda 表达式可以完成简洁的函数定义 Stream API 中大量使用了 Lambda 表达式,可以使用 Lambda 表达式对集合进行操作 Lambda 表达式允许你

    2024年01月25日
    浏览(20)
  • Rust编程基础之函数和表达式

    在之前的文章中,我们已经见到了一个函数:main函数, 它是很多程序的入口点。也见过 fn ,它用来声明新函数。 Rust 代码中的函数和变量名使用 snake case 规范风格。在 snake case 中,所有字母都是小写并使用下划线分隔单词。这是一个包含函数定义示例的程序: 我们在 R

    2024年02月05日
    浏览(49)
  • vue3 setup中函数表达式和函数声明

    随着 Vue 3 中 Composition API 的引入,现在可以通过函数表达式和函数声明这两种方式声明函数。 函数声明是在非函数式编程语言中声明函数的传统或正常方式。以 function 开头,后跟函数名称、一对括号,最后是一对括住函数体的花括号。 这是一个例子: 函数声明的一个

    2024年02月13日
    浏览(41)
  • Lambda表达式 & 函数式接口 & Stream流

    目录 一. Lambda表达式 1. 函数式编程思想概述 2. Lambda的优化 3. Lambda的格式 标准格式: 参数和返回值: 省略格式: 4. Lambda的前提条件  二. 函数式接口 1. 概述 格式 FunctionalInterface注解 2. 常用函数式接口 Supplier接口 Consumer接口 Function接口 Predicate接口 三. Stream流 1 引言 2. 流式思

    2024年02月08日
    浏览(105)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包