Welcome to Swift (苹果官方Swift文档初译与注解三十六)---254~260页(第六章-- 闭包)

Closures (闭包)

  闭包是一段包含自身功能的代码块,它可以在代码中传递.在Swift中,闭包的概念与C和OC中的block相似,与其他语言的lambdas相似.

  当常量和变量在闭包中定义的时候,闭包可以获取(capturing)和存储常量和变量的引用,这像是完全包裹着变量和常量,因此,取名闭包.Swift会为你处理相关的内存管理工作.

  注意:

  如果不熟悉”捕获”(capturing)的概念也不必担心,它会在后面的 Capturing Values章节中详细介绍.

  全局函数和嵌套函数,通常意义上说,都是一种特定的闭包.闭包有三种形式:

  • 全局函数,它有名字但不会获取任何值;
  • 嵌套函数,它有名字,而且会获取它内部的值;
  • 闭包表达式,它是没有名字的闭包,它会获取封闭在内的值

  Swift的闭包表达式有一个清晰干净的样式;简写的建议:

  • 参数和返回值类型使用类型判断;
  • 使用默认的单表达式闭包;
  • 缩写参数名称;
  • 去除闭包语法声明;

Closure Expressions (闭包表达式)

  前面介绍的嵌套函数,它定义自身代码块和名称在一个大的函数中.然后有时候,我们需要一个简写的情况,并且不需要完整的定义和命名.这种情况在你处理一个函数的参数是一个或者  多个函数的时候尤其明显.

  闭包表达式是一种简明内联的定义闭包方式.闭包表达式提供了几种可选的语法来最简单的使用定义闭包.

The Sort Function (排序函数)

  Swift标准库提供了一个排序函数,叫做sort,它可以将数组的值排序,一旦完成排序过程,sort函数会返回一个新的数组,它与原数组类型,大小都相同,只是元素的顺序按照要求改变了.

  下面的闭包表达式例子使用了sort函数来排序数组String值,按照反字母表的顺序进行.这里初始化要被排序的数组:

    let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

  sort函数需要两个参数:

  • 已知类型的数组
  • 一个带两个参数的闭包,参数类型与数组元素类型相同.如果第一个值在排序时在第二个值前面,会返回true,否则返回false

  因为是排序一个String数组,因此排序闭包需要是一个函数类型:(String, String) -> Bool.

  闭包的一种形式是使用一个合适类型的函数,然后将它传递给闭包的第二个参数:

    func backwards(s1: String, s2: String) -> Bool {

        return s1 > s2

    }

    var reversed = sort(names, backwards)

    // reversed is equal to ["Ewa", "Daniella", "Chris", "Barry", "Alex"]

  如果第一个字符串(s1)比第二个字符串(s2)大,函数backwards将返回true,它表示s1在s2的前面.对于字符串来说,大的意思是它在字母表中的位置靠后,例如字母B比字母A大,字符串  Tom比字符串Tim大.

Closure Expression Syntax (闭包表达式语法)

  闭包表达式的通用格式为:

    { (parameters) -> return type in

        statements

    }

  闭包表达式语法可以用常量参数,变量参数以及 inout参数,默认值是不允许提供的.元组也可以作为参数以及返回值.

  下面的例子是backwards函数的闭包表达式版本:

    reversed = sort(names, { (s1: String, s2: String) -> Bool in

        return s1 > s2

        })

  注意,在闭包中定义的函数和返回值类型是根据backwards函数来定的.在这两个例子里,它都写为(s1: String, s2: String) -> Bool.然而,对于内联的闭包表达式,参数和返回值都要  写在()里面.

  闭包体是从关键字in开始作用.这个关键字表示闭包的参数定义以及执行完成后的返回值,以及闭包体从那里开始.

  因为闭包体非常短,它可以写在一行:

  reversed = sort(names, { (s1: String, s2: String) -> Bool in return s1 > s2 } )

posted @ 2014-07-21 18:24  老蔡居士  阅读(659)  评论(0编辑  收藏  举报