闭包(Closure)这个概念如果没学过Swift的人应该也不会陌生。

学过Javascript的朋友应该知道,在Javascript中我们经常会讨论闭包,很多前端工程师的面试题也会问到什么是闭包。

那么,什么是闭包呢?

让我们看下在Javascript中闭包的解释:

Closures are functions that have access to variables from another function’s scope.

(This is often accomplished by creating a function inside a function. )

闭包是一个函数能够访问另外一个函数作用域内变量。

(这通常通过在一个函数内申明另一个函数来实现)

通过上面的定义我们不难判断,闭包具备以下两点特征:

1. 闭包是函数

2. 闭包是函数内部的函数

3. 闭包可以访问另一个函数的变量

我们先来看下Javascipt闭包的例子:

function createComparisonFunction(propertyName) {
return function(object1, object2) {
var value1 = object1[propertyName];
var value2 = object2[propertyName]; if (value1 < value2) {
return -1;
} else if (value1 > value2) {
return 1;
} else {
return 0;
}
};
}

测试代码:

var compare = createComparisonFunction(“name”);
var result = compare({ name: “Nicholas”, age: 35 }, { name: “Greg”, age: 28 });
console.log(result); //

上面的Javascript代码中我们可以看到,

createComparisonFunction函数内部申明的匿名函数可以访问createComparisonFunction函数本身的参数,这正符合了我们闭包的定义。

好了,Swift中闭包大致也是类似的,我们来看下闭包在Swift中的定义:

Closures are discrete bundles of functionality that can be used in your application to accomplish specific tasks.

闭包是用来在你的应用程序内部完成某些特殊任务的一些彼此互不相关的函数集。

读着有些拗口,还是让我们用例子来说话吧,看下下面的例子:

我们先来看一个不适用闭包的数组排序的例子

import Cocoa

// 不使用闭包
var counts = [, , , , , , , , ] func sortAscending(i: Int, j: Int) -> Bool {
return i < j
} let sortedCounts = counts.sort(sortAscending)

现在,我们看下,使用闭包代码会变得更加简洁

import Cocoa

// 使用闭包
var counts = [, , , , , , , , ] let sortedCounts = counts.sort({
(i: Int, j: Int) -> Bool in
return i < j
})

Swift的闭包语法:

{(parameters) -> [return type] in
  // Code
}

通过类型推断(type inference)让闭包变得更加简洁:

import Cocoa

var counts = [, , , , , , , , ]

let sortedCounts = counts.sort({ i, j in i < j })

通过参数占位符让代码变得更简洁:

import Cocoa

var counts = [, , , , , , , , ]

let sortedCounts = counts.sort({ $ < $ })

不难判断,上面的代码$0代表了第一个参数也就是i, 而$1代表了第一个参数也就是j。

哇撒,代码变得越来越短了嘛,还可以再短些吗?

答案是可以的!

还记得C++的内联函(inline function)数嘛,在swift中我们也有!

把括号去掉就是了!

于是,代码变成了如下的样子:

import Cocoa

var counts = [, , , , , , , , ]

let sortedCounts = counts.sort { $ < $ }

最新文章

  1. 前端弹出层框架layer
  2. jieba.NET与Lucene.Net的集成
  3. List集合去重的一种方法
  4. 说说Spring中的WebDataBinder
  5. demo工程的清单文件及activity中api代码简单示例
  6. javascript this
  7. jquery1.9+获取append后的动态元素
  8. position与anchorPoint
  9. record
  10. [ES6] for..in &amp;&amp; for..of
  11. JSON之三:获取JSON文本并解释(以google的天气API为例)
  12. jquery中each用法
  13. Servlet程序开发-Helloworld
  14. 详细解剖大型H5单页面应用的核心技术点
  15. redis单机主从搭建
  16. MyEclipse 2014各种优化设置
  17. BZOJ 1982: [Spoj 2021]Moving Pebbles [博弈论 对称]
  18. day7-基础函数的学习(二)
  19. JS的函数节流(throttle)
  20. kettle 6.1 按时间循环增量抽取数据

热门文章

  1. 逍遥法外第一季/全集How To Get Away With Murder迅雷下载
  2. 手游开发Android平台周边工具介绍
  3. ios成长之每日一遍(day 2)
  4. 根据ImageView的大小来压缩Bitmap,避免OOM
  5. 自定义的开关按钮——SwitchButton
  6. Orchard模块开发全接触6:自定义用户注册
  7. .Net AppDomain详解(一)
  8. [Link]Hive资料整理
  9. [转]使用mysql profiles 来查看sql 语句执行计划
  10. 7.3 netty3基本使用