闭包是功能性自包含模块,可以在代码中被传递和使用。 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. 8.2.5: Spring3.0新增的@DependsOn和@Lazy

    @DependsOn用于强制初始化其他Bean.可以修饰Bean类或方法,使用该Annotation时可以指定一个字符串数组作为参数,每个数组元素对应于一个强制初始化的Bean. @DependsOn ...

  2. 在strings.xml中定义html标签

    在项目的开发过程中,需要用到把html内容放到strings.xml文件中,然后再读取到TextView中.原本以为像普通文本一样直接SetText就行了,结果行不通,大大超出我的预料.经过网上搜索, ...

  3. qt运行库

    KERNEL32.DLL MINGWM10.DLL MSVCRT.DLL LIBGCC_S_DW2-1.DLL QTCORE4.DLL QTGUI4.DLL 笔者安装的是QT SDK.(发行版本这是前 ...

  4. C# NameValueCollection集合 .

    案例: NameValueCollection nameValueCollection = Request.Params;//获得连接地址中的所有参数 //获取各个参数,eg:            ...

  5. Design Pattern Iterator 迭代器设计模式

    这个设计模式感觉很easy,我们平时敲代码的时候也是常常须要调用iterator的,C++和Java都是. 所以感觉没什么特别的.就是须要模仿C++或者Java的iterator类的功能吧. 这里简单 ...

  6. js堆栈溢出错误

    function prompt() { var answer = prompt("What is your name","") if (answer) { al ...

  7. .net通用权限框架B/S (三)--MODEL层(1)

    1.新建c#类库 2.安装配置好entity frame5 3.新建的类库项目上右键"添加--新建项",选择AOD.NET实体数据模型 4.设置数据库连接, 5.选择建好的表 6. ...

  8. MongoDB无法启动的解决方法

    http://dmyz.org/archives/423 遇到MongoDB突然无法启动,第一反应是删除mongod.lock.这个文件在MongoDB的数据库目录下,默认是/data/db.这是最常 ...

  9. SqlServer之表变量和临时表

    表变量: 表变量创建的语法类似于临时表,区别就在于创建的时候,必须要为之命名.表变量是变量的一种, 表变量也分为本地及全局的两种,本地表变量的名称都是以"@"为前缀,只有在本地当前 ...

  10. 解决windows下Eclipse连接远程Hadoop报错

    Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.N ...