闭包是功能性自包含模块,可以在代码中被传递和使用。 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 in
    return num%3 == 0//过滤掉不能被3整除的数
}
println(test)//[9]
var test = nums.filter {
    return $0%3 == 0//过滤掉不能被3整除的数
}

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

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

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

  2. Swift使用闭包表达式

    Swift中的闭包表达式很灵活,其标准语法格式如下:{ (参数列表) ->返回值类型 in    语句组}其中,参数列表与函数中的参数列表形式一样,返回值类型类似于函数中的返回值类型,但不同的是 ...

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

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

  4. Swift闭包概念与常见使用场景总结

    ·Swift 闭包 闭包(Closures)是自包含的功能代码块,可以在代码中使用或者用来作为参数传值. Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些 ...

  5. swift 闭包简写实际参数名$0、$1等理解

    Swift 自动对行内闭包提供简写实际参数名,你也可以通过 $0 , $1 , $2 等名字来引用闭包的实际参数值. 如果你在闭包表达式中使用这些简写实际参数名,那么你可以在闭包的实际参数列表中忽略对 ...

  6. swift闭包-备

    我给Swift 中的闭包一个定义:闭包是自包含的匿名函数代码块,可以作为表达式.函数参数和函数返回值,闭包表达式的运算结果是一种函数类型. Swift中的闭包类似于Objective-C中的代码块.J ...

  7. swift闭包 notes http://www.gittielabs.com

    Swift Closureshtml, body {overflow-x: initial !important;}.CodeMirror { height: auto; } .CodeMirror- ...

  8. Swift 闭包(六)

    http://blog.csdn.net/huangchentao/article/details/32714185 闭包 Closures 1.闭包表达式 闭包表达式是一种利用简单语法构建内联包的方 ...

  9. 学习swift从青铜到王者之swift闭包06

    语法表达式 一般形式:{ (parameters) -> returnType in statements } 这里的参数(parameters),可以是in-out(输入输出参数),但不能设定 ...

随机推荐

  1. php date操作

    date(format,timestamp) d - 月中的天 (01-31) m - 当前月,以数字计 (01-12) Y - 当前的年(四位数) h 小时,12 小时格式,有前导零 01 到 12 ...

  2. zookeeper 手动T掉已挂节点

    zjtest7-redis:/root/zk# cat test_zk.pl use ZooKeeper; use AnyEvent; use AE; use Data::Dumper; use IO ...

  3. 在linux下读取bmp文件头的完整代码。

    呵呵,贴在这里记录一下. [cpp] view plaincopy #include<stdio.h> #include<string.h> #include<sys/t ...

  4. java中读取程序运行时间

    第一种是以毫秒为单位计算的. Java代码 //伪代码 long startTime=System.currentTimeMillis();   //获取开始时间 doSomeThing();  // ...

  5. ln 命令

    ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln –s 源文件 目标文件. 当我们需要在不同的目录,用到相同的 ...

  6. C++STL_max

    template<class T> T max(T a,T b) { return a>b?a:b; }

  7. wormhole提升hivereader读取速度方案

    背景: 最近dw用户反馈wormhole传输速度很慢,有些作业甚至需要3-4个小时才能完成,会影响每天线上报表的及时推送.我看了下,基本都是从Hive到其他数据目的地,也就是使用的是hivereade ...

  8. ShareSDK的简化压缩和使用样例

    share sdk 太大了  于是自己 開始简化,  删除了 ipad 的图片和 framework ,  压缩了 sharesdk 中的 图片,用几k的图片 替换了几个 200多k 的图片 仅仅保留 ...

  9. 浅谈android的selector,背景选择器

    shape和selector的结合使用 (2013-04-07 11:11:00) 转载▼   分类: android 1.Shape (1)作用:XML中定义的几何形状 (2)位置:res/draw ...

  10. Android入门——UI(9)

    SwipRefreshLayout下拉刷新控件 <?xml version="1.0" encoding="utf-8"?> <android ...