闭包是功能性自包含模块,可以在代码中被传递和使用。 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. 新装docker 从本地仓库下载

    docker:/root# docker images Get http:///var/run/docker.sock/v1.19/images/json: dial unix /var/run/do ...

  2. at java.util.concurrent.ConcurrentHashMap.hash(ConcurrentHashMap.java:333)

    at java.util.concurrent.ConcurrentHashMap.hash(ConcurrentHashMap.java:333) 原因: null request

  3. 将String类型的二维数组中的元素用FileOutputStream的write方法生成一个文件

      将String类型的二维数组中的元素用FileOutputStream的write方法生成一个文件import java.io.File;import java.io.FileOutputStre ...

  4. Android 打包签名 从生成keystore到完成签名

    进入生成工具:  工具帮助:   输入指令并获得结果:   转自: http://www.cppblog.com/fwxjj/archive/2010/05/24/116208.html 首先,我们需 ...

  5. 每天一道题:LeetCode

    本人是研二程旭猿一枚,还有半年多就要找工作了,想想上一年度面试阿里的算法工程师挂了,心有不甘啊,主要还是准备不足,对一些常见的算法问题没有去组织准备,为了明年找一份好的实习,就从现在开始,好好准备吧, ...

  6. Android4.2中Phone的P-sensor的应用的分析。

    先说现象,现象就是来电话,接通电话,把手机屏幕靠近脸部,遮挡住P-sensor,屏幕变黑了,不遮挡住P-sensor,屏幕就点亮了.接着我们来看看代码流程. 步骤一: 在PhoneGlobals.ja ...

  7. POJ1325 Machine Schedule 【二分图最小顶点覆盖】

    Machine Schedule Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11958   Accepted: 5094 ...

  8. DevExpress.XtraCharts.chartControl

    private Dictionary<string, double> chartPieDataDic = new Dictionary<string, double>(); p ...

  9. OC中的一个特性:延展

    OC中的一个特性:延展其实说白了,延展就是弥补C语言中的前向申明,我们知道,在C语言中,如果你想调用一个函数的话,那么在此之前必须要声明一个这个函数,就是有前置性.OC中为了弥补C语言中的这个问题,就 ...

  10. 提示constructor无法location的原因

    1.缺少对应属性的set方法 2.缺少确实没有对应的方法 3.对应的构造方法中参数类型不匹配 4.java对象不会在寻找构造函数时执行数据类型的强制类型转换,没有对应的类型就返回异常,不会自动强制转换 ...