Swift学习 -代码之美——闭包

闭包之美

闭包在Swift语言中感觉充分诠释了代码的美,同时也反衬出swift语言的强大无比!

本文要点

  • 闭包表达式在函数调用中的简化
  • 尾随闭包
  • 闭包捕获变量和常量
  • 闭包是引用类型

闭包表达式

我们先了解闭包的基本表达式,然后再用实际的例子去看下闭包表达式神奇的精简过程。

{(parameters) -> return in statements }
闭包表达式替代函数

我们先了解闭包的基本表达式,然后再用实际的例子去看下闭包表达式神奇的精简过程。

var names = ["Mike", "John", "Tom", "Kitty"]

//从小到大排序
func sortFun(s1 : String, s2 : String2) -> Bool {
    return s1 < s2;
}

var sortedNames = sorted (names, sortFun);

1、由函数表达式变成闭包的标准模式:

//  第1步
var sortedNames1 = sorted(names,{(s1:String, s2:String) -> Bool in return s1 < s2})

2、省略参数类型

//  第2步
var sortedNames2 = sorted(names,{(s1, s2) -> Bool in return s1 < s2})

3、省略返回值类型

//  第3步
var sortedNames3 = sorted(names,{(s1, s2) in return s1 < s2})

4、省略返回语句

// 第4步
var sortedNames4 = sorted(names,{(s1, s2) in s1 < s2})

5、省略相同形式内容

//  第5步
var sortedNames5 = sorted(names,{$0 < $1})

6、OMG!没了!

//  第6步
var sortedNames6 = sorted(names,<)

尾随闭包

尾随闭包是指闭包作为参数放在函数的最后面,如果函数最后一个参数是闭包,在调用函数的时候,可以将闭包写在函数外面,如果函数只有一个参数,则函数后圆括号都可以省略;用上面的闭包带入函数里面;

//第1步
sorted(names, {$0 < $1})
//第2步
sorted(names){$0 < $1}
//第3步
sorted{$0 < $1}

捕获闭包的常量和变量

闭包能够在上下文中捕获常量和变量,即使常量和变量的作用域不再存在,闭包捕获的常量和变量仍然会保存最后一次使用他们的值,继续使用;

import Foundation

func makeIncrementor(forIncrement amount: Int) -> () -> Int {
    var runningTotal = 0
    func incrementor() -> Int {
        runningTotal += amount
        return runningTotal
    }
    return incrementor
}
//即使在incrementor返回后,runningTotal仍会保留最近一次使用的值
let incrementByTen = makeIncrementor(forIncrement: 10)

println(incrementByTen())
println(incrementByTen())
println(incrementByTen())

输出结果:

10
20
30

如果获得新的runningTotal值,再次调用makeIncrementor函数即可,如

let incrementByTen = makeIncrementor(forIncrement: 10)

闭包是引用类型

由于闭包有时候会很大,所以Swift语言将其设计成引用类型,引用和C语言指针差不多,多个变量或者常量引用一块内存空间;

let incrementByTen = makeIncrementor(forIncrement: 10)
var incrementByTen1 = incrementByTen //与incrementByTen指向同一个函数
var incrementByTen2 = incrementByTen