Swift语言精要-闭包(Closure)
闭包(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 { $ < $ }
Swift语言精要-闭包(Closure)的更多相关文章
- Swift语言精要 - 浅谈结构体(Struct)
CGRect, CGSize, CGPoint这些是 . String, Int, Array, Dictionary这些我们经常用的也是结构体(Struct). 那么结构体(Struct)到底是什么 ...
- Swift语言精要 - Operator(运算符重载)
运算符重载 Swift的这一语言特性或许应该启发于C++ class Vector2D { var x : Float = 0.0 var y : Float = 0.0 init (x : Floa ...
- Swift语言精要 - 扩展(Extension)
swift的Extension用户在不访问代码的情况下扩展基本结构类型或自定义类 extension Int { var doubled : Int { } func multiplyWith(ano ...
- Swift语言精要 - 序列化和反序列化
在swift中你可以把一个对象转换成为数据,你所要做的就是 首先,你需要让对象实现NSObject和NSCoding协议. 其次,实现以下两个方法: encodeWithCoder init(code ...
- Swift语言精要 - 浅谈代理模式(Delegate)
在iOS编程中,我们经常谈到代理代理,也就是delegate,那么什么是代理呢? 我们来看一下cocoa对它的描述: Delegation is Cocoa’s term for passing of ...
- Swift语言精要 - Dictionary(字典)
字典以键值对的形式存储数据. 键不能重复,但是值可以重复. 基本语法用例: var states : Dictionary<String, String> = ["CA" ...
- Swift语言精要 - 属性
1. Stored Property eg: var number: Int = 0 2. Computed Property eg: var area : Double { get { return ...
- Swift基础之闭包Closure学习
首先Swift语言中没有了Block内容,但是你可以通过调用OC文件使用,也可以使用Closure(闭包),实现Block或者Delegae同样反向传值或回调函数的效果,也可以解决函数指针的问题,两者 ...
- 初探swift语言的学习笔记(闭包 - 匿名函数或block块代码)
很多高级语言都支持匿名函数操作,在OC中的block也为大家所熟悉,然面在swift里好像是被重新作了一个定义,不叫匿名函数,或 block了,而叫闭包(closure).下面配合代码来理解一下swi ...
随机推荐
- 项目从.NET 4.5迁移到.NET 4.0遇到的问题
当把项目从.NET 4.5迁移到.NET 4.0时,遇到的问题和解决如下: 在"属性--应用程序--目标框架"设置成.NET 4.0版本. 重新生成项目,报有关EF的错: 卸载掉项 ...
- Delphi XE 6,Rad Studio XE 6 官方下载(附破解)
官方光盘镜像下载: http://altd.embarcadero.com/download/radstudio/xe6/delphicbuilder_xe6_win.iso RAD Studio ...
- JPA & Hibernate 注解
1 . @Entity(name="EntityName") 必须 ,name 为可选 , 对应数据库中一的个表 2 . @Table(name="",cata ...
- IOS-plist文件DES加密
转载请说明出处:http://www.cnblogs.com/gexun/p/3705207.html,谢谢. 这些天一直在做一个知识问答的项目,因为初赛的项目题目比较少,所以题目就写在本地的plis ...
- android Apk打包过程概述_android是如何打包apk的
流程概述:1.打包资源文件,生成R.java文件2.处理aidl文件,生成相应java 文件3.编译工程源代码,生成相应class 文件4.转换所有class文件,生成classes.dex文件5.打 ...
- Eclipse断点调试(DBG)Android应用
1.添加断点 双击左侧边框便可添加断点,右击也能添加断点. 2.进入调试模式 点击虫子,然后选择工程运行,快捷键为单击F11 ,如果是正常运行就是Ctrl+F11 3.单步调试+跳到下一个断点 运行到 ...
- 部署包含水晶报表Crystal Reports 的VS.NET2005应用程序[原创]
要部署包含水晶报表Crystal Reports 的应用程序,您需要在生成解决方案之前创建一个安装项目,并且向应用程序中添加必要的合并模块. 1.打开 VS.NET2005 编程IDE. 2.在解决方 ...
- 程序中try、throw、catch三者之间的关系
c++程序中,采用一种专门的结构化处理逻辑的异常处理机制. 1.try语句 try语句块的作用是启动异常处理机制,检测try语句块中程序语句执行时可能出现的异常. try语句块总是与catch一同出现 ...
- ConcurrentHashMap和HashMap的区别
(1)ConcurrentHashMap对整个桶数组进行了分段,而HashMap则没有 (2)ConcurrentHashMap在每一个分段上都用锁进行保护,从而让锁的粒度更精细一些,并发性能更好,而 ...
- 分享一个Panda C-60 维修心得
昨天丰臣国际搞了个汽车后备箱市场,说白了就是一帮闲的没事儿的"白领"大热天把自家闲置的东西拿过来练练摊,这个形式还是不错的,中间看到了一个熊猫的CD机,一眼就看上了,虽说CD早就过 ...