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); // 1

 

上面的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 = [1, 6, 2, 28, 13, 2, 9, 100, 30]

func sortAscending(i: Int, j: Int) -> Bool {
    return i < j
}

let sortedCounts = counts.sort(sortAscending)

 

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

import Cocoa

// 使用闭包
var counts = [1, 6, 2, 28, 13, 2, 9, 100, 30]

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 = [1, 6, 2, 28, 13, 2, 9, 100, 30]

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

 

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

import Cocoa

var counts = [1, 6, 2, 28, 13, 2, 9, 100, 30]

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

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

 

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

答案是可以的!

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

把括号去掉就是了!

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

 

import Cocoa

var counts = [1, 6, 2, 28, 13, 2, 9, 100, 30]

let sortedCounts = counts.sort { $0 < $1 }

 

时间: 2024-10-02 21:53:25

Swift语言精要-闭包(Closure)的相关文章

深入理解Swift语言中的闭包机制_Swift

在 Swift 中的闭包类似于结构块,并可以在任何地方调用,它就像 C 和 Objective C 语言内置的函数. 函数内部定义的常数和变量引用可被捕获并存储在闭包.函数被视为封闭的特殊情况,它有 3 种形式. 在 Swift 语言闭合表达式,如下优化,重量轻语法风格,其中包括: 推导参数并从上下文菜单返回值的类型 从单封表达的隐性返回 简略参数名称 尾部闭包语法 语法 下面是一个通用的语法定义用于闭包,它接受参数并返回数据的类型: 复制代码 代码如下:   {(parameters) ->

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

CGRect, CGSize, CGPoint这些是 . String, Int, Array, Dictionary这些我们经常用的也是结构体(Struct).   那么结构体(Struct)到底是什么呢? 学过C语言的朋友一定知道它是什么,在这里我就不多说了,你懂的. 我想说的重要的事情是,你必须搞清楚Struct和类的区别,在Swift中这点特别重要.   一下几点区别: 1) 结构体(Struct)不支持继承,而类(Class)则支持. 2) 结构体(Struct)有一个成员初始化器(m

Swift语言精要 - 扩展(Extension)

swift的Extension用户在不访问代码的情况下扩展基本结构类型或自定义类 extension Int { var doubled : Int { return self * 2 } func multiplyWith(anotherNumber: Int) -> Int { return self * anotherNumber } } 测试代码如下: 2.doubled // = 4 4.multiplyWith(32) // = 128   扩展甚至还可以使类型实现某个协议 下面这个

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

运算符重载 Swift的这一语言特性或许应该启发于C++ class Vector2D { var x : Float = 0.0 var y : Float = 0.0 init (x : Float, y: Float) { self.x = x self.y = y } func +(left : Vector2D, right: Vector2D) -> Vector2D { let result = Vector2D(x: left.x + right.x, y: left.y + r

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

在swift中你可以把一个对象转换成为数据,你所要做的就是 首先,你需要让对象实现NSObject和NSCoding协议. 其次,实现以下两个方法: encodeWithCoder init(coder aDecoder: NSCoder)  // 一个带NSCoder参数的初始化器 例子代码: class SerializableObject : NSObject, NSCoding { var name : String? func encodeWithCoder(aCoder: NSCod

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

在iOS编程中,我们经常谈到代理代理,也就是delegate,那么什么是代理呢? 我们来看一下cocoa对它的描述: Delegation is Cocoa's term for passing off some responsibilities of an object to another 顾名思义: 代理是把职责从一个对象传到另一个对象. 其实,如果编写过Java或者C#程序的朋友应该知道,我们在设计的时候经常使用到接口和组合,道理是一样的. 看一下下面的代码:   首先,我们定义一个协议

Swift语言精要 - 属性

1. Stored Property eg: var number: Int = 0   2. Computed Property eg: var area : Double { get { return width * height }      ... } 完整代码如下: class Rectangle { var width: Double = 0.0 var height: Double = 0.0 var area : Double { // computed getter get {

Swift语言精要 - Dictionary(字典)

字典以键值对的形式存储数据. 键不能重复,但是值可以重复. 基本语法用例: var states : Dictionary<String, String> = ["CA" : "California"] var states : [String : String] = ["CA" : "California"] 也可以使用类型推断的方式: var states = ["CA" : "C

闭包在什么场景下会经常用到?swift语言为例

问题描述 闭包在什么场景下会经常用到?swift语言为例 如题 闭包的 目的 和作用是啥呢 难道就是为了代码简洁 ? 还是 有别的特殊需求 ? 解决方案 closure是指,在一个函数作用域中定义的匿名函数或者Lambda表达式,Lambda表达式可以访问外部的变量,反之则不行,这样无需传参就可以使用外侧的变量,显得简洁,也不用担心匿名函数定义的局部变量污染上下文变量. 解决方案二: 基本就是其他语言的闭包类似的功能.swift中用到了很多闭包.很多库函数都有闭包参数.这样你可以调用函数的时候再