Swift使用闭包表达式
Swift中的闭包表达式很灵活,其标准语法格式如下:
{ (参数列表) ->返回值类型 in
语句组
}
其中,参数列表与函数中的参数列表形式一样,返回值类型类似于函数中的返回值类型,但不同的是后面有in关键字。
Swift提供了多种闭包简化写法,这一节我们将介绍几种不同的形式。
1.类型推断简化
类型推断是Swift的强项,Swift可以根据上下文环境推断出参数类型和返回值类型。以下代码是标准形式的闭包:
{(a:Int, b:Int) -> Int in
return a + b
}
Swift能推断出参数a和b是Int类型,返回值也是Int类型。简化形式如下:
{a, b in return a + b }
使用这种简化方式修改后的示例代码如下:
- func calculate(opr :String)-> (Int,Int)-> Int {
- var result : (Int,Int)-> Int
- switch (opr) {
- case "+" :
- result = {a, b in return a + b } ①
- default:
- result = {a, b in return a - b } ②
- }
- return result;
- }
- let f1:(Int,Int)-> Int = calculate("+")
- println("10 + 5 = \(f1(10,5))")
- let f2:(Int,Int)-> Int = calculate("-")
- println("10 + 5 = \(f2(10,5))")
上述代码第①行和第②行的闭包是上一节示例的简化写法,其中a和b是参数,return后面是返回值。怎么样?很简单吧?
2.隐藏return关键字
如果在闭包内部语句组只有一条语句,如return a + b等,那么这种语句都是返回语句。前面的关键字return可以省略,省略形式如下:
{a, b in a + b }
使用这种简化方式修改后的示例代码如下:
- func calculate(opr :String)-> (Int,Int)-> Int {
- var result : (Int,Int)-> Int
- switch (opr) {
- case "+" :
- result = {a, b in return a + b } ①
- default:
- result = {a, b in return a - b } ②
- }
- return result;
- }
上述代码第①行和第②行的闭包return关键字省略了,需要注意的是,省略的前提是闭包中只有一条return语句。下面这样有多条语句是不允许的。
{a, b in var c; a + b }
3.缩写参数名称
上一节介绍的闭包表达式已经很简洁了,不过,Swift的闭包还可以再进行简化。Swift提供了参数名称缩写功能,我们可以用$0、$1、$2来表示调用闭包中参数,$0指代第一个参数,$1指代第二个参数,$2指代第三个参数,以此类推$n+1指代第n个参数。
使用参数名称缩写,还可以在闭包中省略参数列表的定义,Swift能够推断出这些缩写参数的类型。此外,in关键字也可以省略。参数名称缩写之后如下所示:
{$0 + $1}
使用参数名称缩写修改后的示例代码如下:
- func calculate(opr :String)-> (Int,Int)-> Int {
- var result : (Int,Int)-> Int
- switch (opr) {
- case "+" :
- result = {$0 + $1} ①
- default:
- result = {$0 - $1} ②
- }
- return result;
- }
- let f1:(Int,Int)-> Int = calculate("+")
- println("10 + 5 = \(f1(10,5))")
- let f2:(Int,Int)-> Int = calculate("-")
- println("10 + 5 = \(f2(10,5))")
上述代码第①行和第②行的闭包采用了参数名称缩写。
4.使用闭包返回值
闭包表达本质上是函数类型,是有返回值的,我们可以直接在表达式中使用闭包的返回值。重新修改add和sub闭包,示例代码如下:
- let c1:Int = {(a:Int, b:Int) -> Int in
- return a + b
- }(10,5) ①
- println("10 + 5 = \(c1)")
- let c2:Int = {(a:Int, b:Int) -> Int in
- return a - b
- }(10,5) ②
- println("10 - 5 = \(c2)")
上述代码有两个表达式,第①行代码是给c1赋值,后面是一个闭包表达式。但是闭包表达式不能直接赋值给c1,因为c1是Int类型,需要闭包的返回值。这就需要在闭包结尾的大括号后面接一对小括号(10,5),通过小括号(10,5)为闭包传递参数。第②行代码也是如此。通过这种方法可以为变量和常量直接赋值,在有些场景下使用非常方便。
Swift中的闭包表达式很灵活,其标准语法格式如下:
{ (参数列表) ->返回值类型 in
语句组
}
其中,参数列表与函数中的参数列表形式一样,返回值类型类似于函数中的返回值类型,但不同的是后面有in关键字。
Swift提供了多种闭包简化写法,这一节我们将介绍几种不同的形式。
1.类型推断简化
类型推断是Swift的强项,Swift可以根据上下文环境推断出参数类型和返回值类型。以下代码是标准形式的闭包:
{(a:Int, b:Int) -> Int in
return a + b
}
Swift能推断出参数a和b是Int类型,返回值也是Int类型。简化形式如下:
{a, b in return a + b }
使用这种简化方式修改后的示例代码如下:
- func calculate(opr :String)-> (Int,Int)-> Int {
- var result : (Int,Int)-> Int
- switch (opr) {
- case "+" :
- result = {a, b in return a + b } ①
- default:
- result = {a, b in return a - b } ②
- }
- return result;
- }
- let f1:(Int,Int)-> Int = calculate("+")
- println("10 + 5 = \(f1(10,5))")
- let f2:(Int,Int)-> Int = calculate("-")
- println("10 + 5 = \(f2(10,5))")
上述代码第①行和第②行的闭包是上一节示例的简化写法,其中a和b是参数,return后面是返回值。怎么样?很简单吧?
2.隐藏return关键字
如果在闭包内部语句组只有一条语句,如return a + b等,那么这种语句都是返回语句。前面的关键字return可以省略,省略形式如下:
{a, b in a + b }
使用这种简化方式修改后的示例代码如下:
- func calculate(opr :String)-> (Int,Int)-> Int {
- var result : (Int,Int)-> Int
- switch (opr) {
- case "+" :
- result = {a, b in return a + b } ①
- default:
- result = {a, b in return a - b } ②
- }
- return result;
- }
上述代码第①行和第②行的闭包return关键字省略了,需要注意的是,省略的前提是闭包中只有一条return语句。下面这样有多条语句是不允许的。
{a, b in var c; a + b }
3.缩写参数名称
上一节介绍的闭包表达式已经很简洁了,不过,Swift的闭包还可以再进行简化。Swift提供了参数名称缩写功能,我们可以用$0、$1、$2来表示调用闭包中参数,$0指代第一个参数,$1指代第二个参数,$2指代第三个参数,以此类推$n+1指代第n个参数。
使用参数名称缩写,还可以在闭包中省略参数列表的定义,Swift能够推断出这些缩写参数的类型。此外,in关键字也可以省略。参数名称缩写之后如下所示:
{$0 + $1}
使用参数名称缩写修改后的示例代码如下:
- func calculate(opr :String)-> (Int,Int)-> Int {
- var result : (Int,Int)-> Int
- switch (opr) {
- case "+" :
- result = {$0 + $1} ①
- default:
- result = {$0 - $1} ②
- }
- return result;
- }
- let f1:(Int,Int)-> Int = calculate("+")
- println("10 + 5 = \(f1(10,5))")
- let f2:(Int,Int)-> Int = calculate("-")
- println("10 + 5 = \(f2(10,5))")
上述代码第①行和第②行的闭包采用了参数名称缩写。
4.使用闭包返回值
闭包表达本质上是函数类型,是有返回值的,我们可以直接在表达式中使用闭包的返回值。重新修改add和sub闭包,示例代码如下:
- let c1:Int = {(a:Int, b:Int) -> Int in
- return a + b
- }(10,5) ①
- println("10 + 5 = \(c1)")
- let c2:Int = {(a:Int, b:Int) -> Int in
- return a - b
- }(10,5) ②
- println("10 - 5 = \(c2)")
上述代码有两个表达式,第①行代码是给c1赋值,后面是一个闭包表达式。但是闭包表达式不能直接赋值给c1,因为c1是Int类型,需要闭包的返回值。这就需要在闭包结尾的大括号后面接一对小括号(10,5),通过小括号(10,5)为闭包传递参数。第②行代码也是如此。通过这种方法可以为变量和常量直接赋值,在有些场景下使用非常方便。
关注智捷iOS课堂微信公共平台
Swift使用闭包表达式的更多相关文章
- Swift 闭包表达式
闭包是功能性自包含模块,可以在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C 中的 blocks 以及其他一些编程语言中的 lambdas 比较相似. 闭包的形式主要有三 ...
- Swift:闭包
一.闭包的介绍 闭包表达式(Closure Expressions) 尾随闭包(Trailing Closures) 值捕获(Capturing Values) 闭包是引用类型(Closures Ar ...
- Swift的闭包(一):闭包简介、闭包表达式的优化
定义:Closures are self-contained blocks of functionality that can be passed around and used in your co ...
- Swift --闭包表达式与闭包(汇编分析)
在Swift中,可以通过func定义一个函数,也可以通过闭包表达式定义一个函数! 一.闭包表达式 概念 闭包表达式与定义函数的语法相对比,有区别如下: 去除了func 去除函数名 返回值类型添加了关键 ...
- iOS - Swift Closure 闭包
1.Closure 闭包在 Swift 中非常有用.通俗的解释就是一个 Int 类型里存储着一个整数,一个 String 类型包含着一串字符,同样,闭包是一个包含着函数的类型.有了闭包,你就可以处理很 ...
- swift中闭包的学习。
在swift中的闭包等同于OC中的block,它的用途就是在于可以包装一段代码在必要的时候进行调用. 闭包定义: {(类型列表) -> 返回值 in // 多条swift语句 // 执行代码 ...
- 【Swift 】- 闭包
闭包是自包含带函数代码块,可以在代码中被传递和使用.我觉得可以这样理解:闭包相当于C#中的lambda表达式: 全局函数和嵌套函数,实际也是特殊的闭包. 通常闭包是以下三种形式: a,全局函数是一个有 ...
- Swift:闭包(Closures)
一. 基本概念 闭包(Closures)是自包括的功能代码块,能够在代码中使用或者用来作为參数传值. 在Swift中的闭包与C.OC中的blocks和其他编程语言(如C#)中的lambda, java ...
- Swift之闭包
swift中闭包是一个非常强大的东西,闭包是自包括的函数代码块,能够在代码中被传递和使用.跟C 和 Objective-C 中的代码块(blocks)非常相似 .这个大家必须掌握!必须掌握! 必须掌握 ...
随机推荐
- 如何同时启动多个Tomcat服务
在项目开发中,有时会需要同时启动多个Tomcat服务,如果直接启动多个的话,会报以下错误: Port busy xxxx java.net.SocketException: Unrecognized ...
- Oracle DataGuard搭建(一)
第一次搭建oracle dataguard.学oracle很长时间,却没有完整的搭过dg,说起来让人笑.总得有第一次,而且第一次总是很痛苦的. 数据库版本: Oracle Database 11g E ...
- Spring声明式事务的配置~~~
/*2011年8月28日 10:03:30 by Rush */ 环境配置 项目使用SSH架构,现在要添加Spring事务管理功能,针对当前环境,只需要添加Spring 2.0 AOP类库即可.添加 ...
- openssl生成rsa公私钥
1.生成私钥pem, 执行命令openssl genrsa -out rsa_private_key.pem 1024 2.生成公钥,执行命令openssl rsa -in rsa_private_ ...
- Android Studio升级后projectBuild failed.
近期在升级Android Studio后,发现原先能编译通过的project,突然就编译只是了,原因是生成的AndroidManifest.xml文件里有乱码. 升级后: android studio ...
- iOS开发——UI篇OC篇&UITableView简单封装
UITableView简单封装 UITableView时iOS开发中使用最多也是最重的一个UI空间,其实在App Store里面的%80以上的应用都用到了这个控件,所以就给大家介绍一下,前面的文章中也 ...
- mysql 分布式事务
php + mysql 分布式事务 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元: 事务应该具有4个属性:原子性.一致性.隔离性.持续性 原子性(atomicit ...
- C#多线程的介绍(园子里比较全的一篇)
一.多线程的概念 Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程.什么是进程呢?当一个程序开始运行时,它就是一 ...
- CentOS中查看系统资源占用情况的命令
用 'top -i' 看看有多少进程处于 Running 状态,可能系统存在内存或 I/O 瓶颈,用 free 看看系统内存使用情况,swap 是否被占用很多,用 iostat 看看 I/O 负载情况 ...
- 双系统下,Windows如何正确删除Linux系统
一般电脑装了双系统,特别是Windows加Linux的电脑,不可以在Windows中直接删了linux,因为一般安装linux的时候,grub都写进了mbr,直接删了Windows就进不了了,除非原来 ...