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 }
使用这种简化方式修改后的示例代码如下:

  1. func calculate(opr :String)-> (Int,Int)-> Int {
  2. var result : (Int,Int)-> Int
  3. switch (opr) {
  4. case "+" :
  5. result = {a, b in return a + b }        ①
  6. default:
  7. result = {a, b in return a - b }        ②
  8. }
  9. return result;
  10. }
  11. let f1:(Int,Int)-> Int = calculate("+")
  12. println("10 + 5 = \(f1(10,5))")
  13. let f2:(Int,Int)-> Int = calculate("-")
  14. println("10 + 5 = \(f2(10,5))")

上述代码第①行和第②行的闭包是上一节示例的简化写法,其中a和b是参数,return后面是返回值。怎么样?很简单吧?
2.隐藏return关键字
如果在闭包内部语句组只有一条语句,如return a + b等,那么这种语句都是返回语句。前面的关键字return可以省略,省略形式如下:
{a, b in a + b }
使用这种简化方式修改后的示例代码如下:

  1. func calculate(opr :String)-> (Int,Int)-> Int {
  2. var result : (Int,Int)-> Int
  3. switch (opr) {
  4. case "+" :
  5. result = {a, b in return a + b }        ①
  6. default:
  7. result = {a, b in return a - b }        ②
  8. }
  9. return result;
  10. }

上述代码第①行和第②行的闭包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}
使用参数名称缩写修改后的示例代码如下:

  1. func calculate(opr :String)-> (Int,Int)-> Int {
  2. var result : (Int,Int)-> Int
  3. switch (opr) {
  4. case "+" :
  5. result = {$0 + $1}  ①
  6. default:
  7. result = {$0 - $1}  ②
  8. }
  9. return result;
  10. }
  11. let f1:(Int,Int)-> Int = calculate("+")
  12. println("10 + 5 = \(f1(10,5))")
  13. let f2:(Int,Int)-> Int = calculate("-")
  14. println("10 + 5 = \(f2(10,5))")

上述代码第①行和第②行的闭包采用了参数名称缩写。
4.使用闭包返回值
闭包表达本质上是函数类型,是有返回值的,我们可以直接在表达式中使用闭包的返回值。重新修改add和sub闭包,示例代码如下:

  1. let c1:Int = {(a:Int, b:Int) -> Int in
  2. return a + b
  3. }(10,5)       ①
  4. println("10 + 5 = \(c1)")
  5. let c2:Int = {(a:Int, b:Int) -> Int in
  6. return a - b
  7. }(10,5)     ②
  8. println("10 - 5 = \(c2)")

上述代码有两个表达式,第①行代码是给c1赋值,后面是一个闭包表达式。但是闭包表达式不能直接赋值给c1,因为c1是Int类型,需要闭包的返回值。这就需要在闭包结尾的大括号后面接一对小括号(10,5),通过小括号(10,5)为闭包传递参数。第②行代码也是如此。通过这种方法可以为变量和常量直接赋值,在有些场景下使用非常方便。

更多内容请关注国内第一本Swift图书《Swift开发指南》
本书交流讨论网站:http://www.51work6.com/swift.php
欢迎加入Swift技术讨论群:362298485

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 }
使用这种简化方式修改后的示例代码如下:

  1. func calculate(opr :String)-> (Int,Int)-> Int {
  2. var result : (Int,Int)-> Int
  3. switch (opr) {
  4. case "+" :
  5. result = {a, b in return a + b }        ①
  6. default:
  7. result = {a, b in return a - b }        ②
  8. }
  9. return result;
  10. }
  11. let f1:(Int,Int)-> Int = calculate("+")
  12. println("10 + 5 = \(f1(10,5))")
  13. let f2:(Int,Int)-> Int = calculate("-")
  14. println("10 + 5 = \(f2(10,5))")

上述代码第①行和第②行的闭包是上一节示例的简化写法,其中a和b是参数,return后面是返回值。怎么样?很简单吧?
2.隐藏return关键字
如果在闭包内部语句组只有一条语句,如return a + b等,那么这种语句都是返回语句。前面的关键字return可以省略,省略形式如下:
{a, b in a + b }
使用这种简化方式修改后的示例代码如下:

  1. func calculate(opr :String)-> (Int,Int)-> Int {
  2. var result : (Int,Int)-> Int
  3. switch (opr) {
  4. case "+" :
  5. result = {a, b in return a + b }        ①
  6. default:
  7. result = {a, b in return a - b }        ②
  8. }
  9. return result;
  10. }

上述代码第①行和第②行的闭包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}
使用参数名称缩写修改后的示例代码如下:

  1. func calculate(opr :String)-> (Int,Int)-> Int {
  2. var result : (Int,Int)-> Int
  3. switch (opr) {
  4. case "+" :
  5. result = {$0 + $1}  ①
  6. default:
  7. result = {$0 - $1}  ②
  8. }
  9. return result;
  10. }
  11. let f1:(Int,Int)-> Int = calculate("+")
  12. println("10 + 5 = \(f1(10,5))")
  13. let f2:(Int,Int)-> Int = calculate("-")
  14. println("10 + 5 = \(f2(10,5))")

上述代码第①行和第②行的闭包采用了参数名称缩写。
4.使用闭包返回值
闭包表达本质上是函数类型,是有返回值的,我们可以直接在表达式中使用闭包的返回值。重新修改add和sub闭包,示例代码如下:

  1. let c1:Int = {(a:Int, b:Int) -> Int in
  2. return a + b
  3. }(10,5)       ①
  4. println("10 + 5 = \(c1)")
  5. let c2:Int = {(a:Int, b:Int) -> Int in
  6. return a - b
  7. }(10,5)     ②
  8. println("10 - 5 = \(c2)")

上述代码有两个表达式,第①行代码是给c1赋值,后面是一个闭包表达式。但是闭包表达式不能直接赋值给c1,因为c1是Int类型,需要闭包的返回值。这就需要在闭包结尾的大括号后面接一对小括号(10,5),通过小括号(10,5)为闭包传递参数。第②行代码也是如此。通过这种方法可以为变量和常量直接赋值,在有些场景下使用非常方便。

更多内容请关注国内第一本Swift图书《Swift开发指南》
本书交流讨论网站:http://www.51work6.com/swift.php
欢迎加入Swift技术讨论群:362298485

关注智捷iOS课堂微信公共平台

Swift使用闭包表达式的更多相关文章

  1. Swift 闭包表达式

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

  2. Swift:闭包

    一.闭包的介绍 闭包表达式(Closure Expressions) 尾随闭包(Trailing Closures) 值捕获(Capturing Values) 闭包是引用类型(Closures Ar ...

  3. Swift的闭包(一):闭包简介、闭包表达式的优化

    定义:Closures are self-contained blocks of functionality that can be passed around and used in your co ...

  4. Swift --闭包表达式与闭包(汇编分析)

    在Swift中,可以通过func定义一个函数,也可以通过闭包表达式定义一个函数! 一.闭包表达式 概念 闭包表达式与定义函数的语法相对比,有区别如下: 去除了func 去除函数名 返回值类型添加了关键 ...

  5. iOS - Swift Closure 闭包

    1.Closure 闭包在 Swift 中非常有用.通俗的解释就是一个 Int 类型里存储着一个整数,一个 String 类型包含着一串字符,同样,闭包是一个包含着函数的类型.有了闭包,你就可以处理很 ...

  6. swift中闭包的学习。

    在swift中的闭包等同于OC中的block,它的用途就是在于可以包装一段代码在必要的时候进行调用. 闭包定义:  {(类型列表) -> 返回值 in // 多条swift语句 // 执行代码 ...

  7. 【Swift 】- 闭包

    闭包是自包含带函数代码块,可以在代码中被传递和使用.我觉得可以这样理解:闭包相当于C#中的lambda表达式: 全局函数和嵌套函数,实际也是特殊的闭包. 通常闭包是以下三种形式: a,全局函数是一个有 ...

  8. Swift:闭包(Closures)

    一. 基本概念 闭包(Closures)是自包括的功能代码块,能够在代码中使用或者用来作为參数传值. 在Swift中的闭包与C.OC中的blocks和其他编程语言(如C#)中的lambda, java ...

  9. Swift之闭包

    swift中闭包是一个非常强大的东西,闭包是自包括的函数代码块,能够在代码中被传递和使用.跟C 和 Objective-C 中的代码块(blocks)非常相似 .这个大家必须掌握!必须掌握! 必须掌握 ...

随机推荐

  1. [置顶] 《Windows编程零基础》__2 一个完整的程序

    Windows开发的常识 1)窗口 Windows中最基本的概念也许就是窗口了,每一个前台程序都至少有一个窗口,一个窗口也是你可以看到的部分,比如,QQ有如下的登录窗口 基本上你在Windows中可见 ...

  2. Linux在向磁盘新建文件的时候在系统层面的四步操作

    ----------- 1.存储文件属性.内核先找到一个空的i节点,并把文件属性信息记录其中.   2.存储数据.先计算要多少个磁盘块,在内核自由块列表找到合适数量的磁盘块,并把数据从内核的缓冲区依次 ...

  3. 2015 NOIP day2 t2 信息传递 tarjan

    信息传递 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.luogu.org/problem/show?pid=2661 Descrip ...

  4. SpringMVC4.2.4 xml配置

    环境:1.基于spring4.2.4版本,也是spring当前(2016.2)最新的GA版本 2.maven 3.2.1 3.jdk1.7 xml配置1: web.xml <?xml versi ...

  5. Maven3.2创建webapp项目过程中问题以及解决方案

    用maven组件来创建web项目,maven的好处一大堆,但是在创建项目的时候问题也很多,诸多不顺,网上找了很多资料,貌似都没能解决问题. 环境:jdk1.7.0_80,eclipse4.4,mave ...

  6. 【转】VIM 快速注释

    我是用自己自定义的,跟你分享一下吧.希望能帮到你. 在.vimrc中加入下面的语句:vmap <C-S-P>    dO#endif<Esc>PO#if 0<Esc> ...

  7. Android播播放完SD卡指定文件夹音乐之后,自动播放下一首

    最近做一个项目,需要连续播放音乐,播放完一首歌之后,自动播放完下一首歌.不要重复播放. 代码如下: package com.example.asyncplayer_ex; import java.io ...

  8. NSRange类详解

    NSRange的定义 { NSUInteger location; NSUInteger length; } NSRange; NSRange是一个结构体,其中location是一个以0为开始的ind ...

  9. iOS开发——UI篇&文字渐变效果:图层中的mask属性

    文字渐变效果:图层中的mask属性 本次文章,主要讲述的是图层中的mask属性,利用它,可以做出文字渐变效果! 一.文字渐变效果: 二.文字渐变实现思路: 1.创建一个颜色渐变层,渐变图层跟文字控件一 ...

  10. Fedora安装

    转载:http://www.51ou.com/browse/fedora/33174.html 安装fedora后的20个系统设置 安装VirtualBox增强工具 1.编辑sudoers文件,先备份 ...