闭包(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)的更多相关文章

  1. Swift语言精要 - 浅谈结构体(Struct)

    CGRect, CGSize, CGPoint这些是 . String, Int, Array, Dictionary这些我们经常用的也是结构体(Struct). 那么结构体(Struct)到底是什么 ...

  2. Swift语言精要 - Operator(运算符重载)

    运算符重载 Swift的这一语言特性或许应该启发于C++ class Vector2D { var x : Float = 0.0 var y : Float = 0.0 init (x : Floa ...

  3. Swift语言精要 - 扩展(Extension)

    swift的Extension用户在不访问代码的情况下扩展基本结构类型或自定义类 extension Int { var doubled : Int { } func multiplyWith(ano ...

  4. Swift语言精要 - 序列化和反序列化

    在swift中你可以把一个对象转换成为数据,你所要做的就是 首先,你需要让对象实现NSObject和NSCoding协议. 其次,实现以下两个方法: encodeWithCoder init(code ...

  5. Swift语言精要 - 浅谈代理模式(Delegate)

    在iOS编程中,我们经常谈到代理代理,也就是delegate,那么什么是代理呢? 我们来看一下cocoa对它的描述: Delegation is Cocoa’s term for passing of ...

  6. Swift语言精要 - Dictionary(字典)

    字典以键值对的形式存储数据. 键不能重复,但是值可以重复. 基本语法用例: var states : Dictionary<String, String> = ["CA" ...

  7. Swift语言精要 - 属性

    1. Stored Property eg: var number: Int = 0 2. Computed Property eg: var area : Double { get { return ...

  8. Swift基础之闭包Closure学习

    首先Swift语言中没有了Block内容,但是你可以通过调用OC文件使用,也可以使用Closure(闭包),实现Block或者Delegae同样反向传值或回调函数的效果,也可以解决函数指针的问题,两者 ...

  9. 初探swift语言的学习笔记(闭包 - 匿名函数或block块代码)

    很多高级语言都支持匿名函数操作,在OC中的block也为大家所熟悉,然面在swift里好像是被重新作了一个定义,不叫匿名函数,或 block了,而叫闭包(closure).下面配合代码来理解一下swi ...

随机推荐

  1. Windows Phone本地数据库(SQLCE):1、介绍(翻译)(转)

    一只大菜鸟,最近要学习windows phone数据库相关的知识,找到了一些比较简短的教程进行学习,由于是英文的,顺便给翻译了.本身英语水平就不好,估计文中有不少错误,如果有不幸读到的童鞋请保持对翻译 ...

  2. dispatch_group_async 使用详解

    dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他的操作.这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了.下面是一段例子 ...

  3. Linux isql

    登录Linux环境,执行 isql -s 命令,进入isql命令页面 进入后页面如下: 选择Query-Language回车,选项可进行数据库操作 进入后,选择要操作的数据库,回车 进行入数据库后的数 ...

  4. 架构:Introducing Expert Systems and Distributed Architecure

    原文地址:http://www.yourenterprisearchitect.com/2011/10/introducing-service-bus.html.   Expert Systems. ...

  5. Linux学习11-CentOS如何设置java环境变量

    前言 之前用yum安装的java,现在想添加环境变量,yum安装的java路径在哪呢?如何找到安装的路径,把jdk添加到环境变量. 本篇详细讲解linux系统设置java环境变量 找到jdk路径 之前 ...

  6. Cannot find snapshot in models/VGGNet/VOC0712/SSD_300x300

    错误描述: 执行 python examples/ssd/ssd_pascal.py 报错: Cannot find snapshot in models/VGGNet/VOC0712/SSD_300 ...

  7. Resultset转Bean工具类

    package org.pandas.webIdp.webOP.help; import java.lang.reflect.Field; import java.lang.reflect.Metho ...

  8. 代码提示级别设置 inspection

    配置文件 profile [ˈproʊfaɪl] n.侧面; 外形,轮廓; 人物简介; vt.描-的轮廓; 给-画侧面图; inspection [ɪnˈspɛkʃən] n.检验; 检查; 视察; ...

  9. 怎样修改SQL Server 2005/2008的系统存储过程(转)

    我们知道,SQL Server 2005/2008的系统存储过程在正常情况下是无法直接修改的. 尽管本文是介绍怎样修改它的,但在这里,我还是建议大家尽量不要去修改它.(好像有点绕哈...) OK,闲话 ...

  10. Android -- tools

    工具属性 Android 有一个专用的XML命名空间,用于使工具可以记录XML文件里的信息,并且在打包程序的进行把信息剥离到不会带来运行时期和下载大小的负面影响的程度. 这个命名空间的 URI 是 h ...