Swift学习笔记 闭包表达式

      闭包是功能性自包含模块,可以在代码中被传递和使用。 Swift 中的闭包与 C 和 Objective-C 中的 blocks 以及其他一些编程语言中的 lambdas 比较相似。 

  闭包的形式主要有三种:

          1. 全局函数是一个有名字但不会捕获任何值的闭包

          2. 嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包
          3. 闭包表达式是一个利用轻量级语法所写的可以捕获其上下文中变量或常量值的没有名字 的闭包 

      Swift 的闭包表达式拥有简洁的风格,并鼓励在常见场景中以实现语法优化,主要优化如下:

          * 利用上下文推断参数和返回值类型

          * 单表达式(single-expression)闭包可以省略 return 关键字

          * 参数名称简写
          * Trailing 闭包语法 (结尾闭包)

嵌套函数:

var nums = [1,9,2,8]
func testF(num1 : Int, num2 : Int) -> Bool{return num1 > num2
}
sort(&nums, testF)
println(nums)//[9, 8, 2, 1]

没有优化的闭包表达式:

var nums = [1,9,2,8]
sort(&nums,{(num1:Int,num2:Int) -> Bool in //in 参数以及返回值与闭包主体的分割线
return num1 > num2
})
println(nums)//[9, 8, 2, 1]

简化闭包函数表达式:(语法优化)

var nums = [1,9,2,8]
sort(&nums,{(num1,num2) in           //in 参数以及返回值与闭包主体的分割线return num1 > num2})
println(nums)//[9, 8, 2, 1]

再简:

var nums = [1,9,2,8]
sort(&nums,{ $0 > $1})//$0代表第一个,$1代表第二个参数
println(nums)//[9, 8, 2, 1]

再简:

var nums = [1,9,2,8]
sort(&nums,>)// 直接使用Swift的数组中的类型定义的关于大于号 (>) 的实现 func >(lhs: Int, rhs: Int) -> Bool
println(nums)//[9, 8, 2, 1]

 

Trailing 闭包语法 (结尾闭包)

    当一个闭包表达式作为最后一个参数传递给函数,我们可以使用结尾闭包来增强可读性,上面的例子也可按照下面的写法来写:

var nums = [1,9,2,8]
//这种写法
sort(&nums){ num1,num2 -> Bool in  //in 参数以及返回值与闭包主体的分割线return num1 > num2
}
//这种写法
sort(&nums){return $0 > $1
}
//但是如果使用的是已声明的函数的话,只能这种
sort(&nums,>)
println(nums)//[9, 8, 2, 1]

比如数组的过滤可以简便的这样写:

var nums = [1,9,2,8]
var test = nums.filter { num -> Bool inreturn num%3 == 0//过滤掉不能被3整除的数
}
println(test)//[9]

 

var test = nums.filter {return $0%3 == 0//过滤掉不能被3整除的数
}

 

 

 

转载于:https://www.cnblogs.com/imhere/p/4255327.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472475.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

链接聚合是将一组物理接口_500字描述华为VLAN聚合工作原理 你看懂了吗?

VLAN聚合的工作过程和通行情况是如何的呢?工作原理如下:和普通VLAN都有一个三层逻辑接口和若干物理接口,VLAN聚合定义的Super-VLAN和Sub-VLAN比较特殊:Sub-VLAN:只包含物理接口,不能建立三层VLANIF接口&…

天池 在线编程 区分用户名(哈希)

文章目录1. 题目2. 解题1. 题目 描述 给出一组用户名,如果有重复的用户名,则在用户名后添加数字区别,并返回修改后的数组。 样例 1: 输入:["aa", "bb", "cc", "bb", "aa", &…

Android标签库,JSP Struts之HTML标签库详解 _Android/移动互联网/物联网/_夜鹰教程网...

标签库 说明HTML 标签 用来创建能够和 Struts 框架和其他相应的 HTML 标签交互的 HTML 输入表单Bean 标签 在访问 JavaBeans 及其属性,以及定义一个新的 bean 时使用Logic 标签 管理条件产生的输出和对象集产生的循环Template 标签 随着 Tiles 框架包的出现&#xf…

python实现解释器_Python设计模式之解释器模式

解释器模式 对每个应用来说,至少有以下两种不同的用户分类。 基本用户:这类用户只希望能够凭直觉使用应用。他们不喜欢花太多时间配置或学习应用的内部。对他们来说,基本的用法就足够了。 高级用户:这些用户,实际上通常…

蓝桥杯 之 基础练习10:十进制转十六进制

【循环 整除 求余 判断】 /*问题描述 十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,…

python选项卡控件_python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与...

PyQt5选项卡控件QTabWidget简介QTabWidget控件提供了一个选项卡和一个页面区域,默认显示第一个选项卡的页面,通过单击各选项卡可以查看对应的界面,如果在一个窗口中显示的输入字段很多,则可以对这些字段进行拆分,分别放…

天池 在线编程 区间合并(字符串)

文章目录1. 题目2. 解题1. 题目 描述 现在给你两个字符串区间(按字典顺序), 请你判断两个区间是否可以合并。 字符串区间[a, b),包括所有以a开头的字符串。 例如,区间[a, b)和区间[ab,c)是可以合并的, 区间[a,b)和区间[b, c]也是可以合并的…

Android全局窗口模糊,javascript – 窗口焦点和模糊事件在Android浏览器上无法正常工作...

我发现当连接到窗口,文档或正文时,javascript焦点和模糊事件在Android浏览器上无法正确触发.我想要一个在桌面浏览器上正常工作的简单测试脚本,但在Android股票浏览器,Dolphin和Opera mobile上都失败了:Focus testwindow.onfocus function() {document.getElementB…

burp爆破线程设置多少_你知道线程池创建多少线程比较合理吗?

为什么会使用多线程创建多少线程比较合适结束语《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解析 —— 精品合集》《Spring MVC 实现原理与源码解析 —— 精品合集》《Spring Boot …

LeetCode 1812. 判断国际象棋棋盘中一个格子的颜色

文章目录1. 题目2. 解题1. 题目 给你一个坐标 coordinates ,它是一个字符串,表示国际象棋棋盘中一个格子的坐标。下图是国际象棋棋盘示意图。 如果所给格子的颜色是白色,请你返回 true,如果是黑色,请返回 false 。 给…

Unity 官方网站

http://msdn.microsoft.com/en-us/library/dn170416.aspx转载于:https://www.cnblogs.com/Qiaoyq/p/4257355.html

python数组遍历输出所有组合_python遍历列表和数组实例讲解

python遍历实例总结python同时遍历数组的索引和值的实例你想在迭代一个序列的同时跟踪正在被处理的元素索引。获取索引内置的 enumerate() 函数可以很好的解决这个问题:>>> my_list [a, b, c]>>> for idx, val in enumerate(my_list):... print(…

dev c++ 代码补全_zsh配置与代码自动补全+tmux配置

先上链接ohmyzsh​github.comzsh-autosuggestions​github.comgpakosz/.tmux​github.com问题描述代码需要,更换了服务器,发现新服务器上zsh没有自动补全,难受得不行,并且没有个性化的配置,强迫症顶不住,tm…

android 获取栈顶activity,Android : 如何得到Activities栈顶的Activity名称

众所周知,Android中的任务等等都是通过栈来管理的,Activities的管理也不例外。栈这种数据结构是大家再熟悉不过了。它的先进后出特性让Android可以很容易实现从当前Activity回到或者重新启动先前的Activity.(注:当系统资源匮乏的时候,系统会释…

京东抢购助手_[Windows] 京东极速抢购助手V2.0,支持京东健康+扫货抢购

本软件仅供学习交流,完全免费,同时也为帮助有缘人能买到自用的口罩,度过这段特殊时期!请勿用于其它用途,谢谢!如有违规,请删帖!下载地址:https://www.lanzous.com/ia3bfl…

SQL Server 和 Oracle 以及 MySQL 有哪些区别?

SQL,在这里我理解成SQL Server。三者是目前市场占有率最高(依安装量而非收入)的关系数据库,而且很有代表性。排行第四的DB2(属IBM公司),与Oracle的定位和架构非常相似,就不赘述了。 …

LeetCode 1813. 句子相似性 III

文章目录1. 题目2. 解题1. 题目 一个句子是由一些单词与它们之间的单个空格组成,且句子的开头和结尾没有多余空格。 比方说,"Hello World" ,"HELLO" ,"hello world hello world" 都是句子。 每个单…

vim配置python开发环境_GitHub - TTWShell/legolas-vim: Vim配置,为python、go开发者打造的IDE。...

legolas-vim个人vim配置。支持python、go等自动提示,支持python、go的函数跳转(python支持虚拟环境)。 最终效果图(函数列表的feature已移除,因为大项目会导致性能问题):支持Python自动补全的最…

android 脚本引擎,GitHub - PassByYou888/zExpression: 脚本与编译器内部的语法引擎内核,也是一种op内核,zExpression可以轻松实现自己的脚本引擎...

zExpression 句法编译器解释器,脚本引擎内核技术体系解释:在编译原理的技术体系中,凡是处理文本化的代码前,都需要做一次预处理,其中我们常说的语法,语法糖,都是一种预处理程序词法:…

平面设计中的网格系统pdf_平面设计基础知识

导语:“ 给大家推荐优质书籍,包含平面设计基础入门知识的书籍分享”。平面设计基础知识分享书籍名称:《写给大家看的设计书》作者:[美]罗宾威廉姆斯著平面设计的四个原则:复杂的设计原理在《写给大家看的设计书》中凝炼…