Below you will find pages that utilize the taxonomy term “Swift,翻译”
Posts
Swift 编程之闭包(翻译)
最近Apple新出的 Swift 语言非常火,我们公司也在陆续组织翻译《The swift programming language》 这本官方电子书,为公司博客增加一些人气。这篇博客就是我负责的其中之一的产物。在公司博客放了一份,这里也放一份。
闭包 **闭包(Closures)**是可以在你的代码里传递和使用的,自包含的功能代码块。Swift 里的闭包跟 C 和 Objective-C 里的 block 类似,也就是其他语言里的所谓的 lambda 。
闭包可以从定义的上下文(Context)里捕获和存储常量或者变量的引用。这被称为“闭合”(closing over)了这些常量和变量,这也是“闭包”名称的由来。Swift 帮你处理了所有捕获相关的内存管理。
注意
不用担心你不理解“捕获”这个概念。会在下文里详细解释。 在函数一章中介绍的全局和嵌套函数,其实是闭包的特殊形式,闭包表现为三种形式:
拥有一个函数名,并且不捕获任何值的闭包称为全局函数。 拥有一个函数名,并且从外部函数捕获值的闭包,称为嵌套函数。 使用轻量级语法编写,并且没有命名的闭包表达式,可以从周围上下文中捕获值 Swift 的闭包表达式语法拥有一个干净、清晰风格,针对大多数应用场景里做了优化,倾向于简明、整洁的语法:
根据上下文信息,为参数和返回值的自动做类型推断。 单一闭包表达式的隐式返回。 参数的速记法。 拖尾闭包(Trailing Closure)语法。 下面我们开始详细介绍。
闭包表达式 在嵌套函数一节中介绍的嵌套函数,是在一个更大的函数内部定义和命名一部分自包含的代码块的常见方式。尽管如此,编写不需要完整的声明和命名的函数构造有时候会更有用处。这在你需要将其他函数当做一个或者多个参数传递的时候会很常见。
闭包表达式 就是一种编写简短并且清晰的内联式闭包的方式。闭包表达式提供了了多种语法,优化到最简单的方式来编写闭包,而且没有失去代码的清晰和意图。下面小节中举例提到的例子,就是通过数次迭代重新定义一个排序函数来展示这些优化,每一次迭代步骤中的表达式都拥有相同的功能,但是将更加简明。
排序函数 Swift 的标准库提供了一个sort函数,可以用来排序一个已知类型的数组,在你提供的排序闭包函数的输出的基础上做到。当完成排序后,sort函数返回一个新的数组,类型和大小都跟“旧”的一样,并且里面的元素按照正确的顺序排好序。
下面的闭包表达式例子,使用sort按照字母倒序的顺序排序一个字符串数组,这是初始数组(未排序的):
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"] sort函数接收两个参数:
一个已知类型的数组。 一个接收两个相同类型的数组元素的闭包,返回一个布尔值,表示第一个参数是在第二个参数之前还是之后。排序闭包如果返回true,表示第一个参数应该在第二个参数之前,false则相反。 这个例子排序一个字符串数组,因此排序闭包必须是一个(String, String) -> Bool签名的函数。
编写一个类型正确的普通函数就能做到,传入sort作为第二个参数:
func backwards(s1: String, s2: String) -> Bool { return s1 > s2 } var reversed = sort(names, backwards) // reversed的数组等于["Ewa", "Daniella", "Chris", "Barry", "Alex"] 如果第一个字符串(s1)比第二个字符串(s2)大,backwards函数返回true,表示最终的结果数组中s1应该在s2之前。对于字符串中的字符(character)来说,所谓“更大”的意思就是“出现在字母表的更后面”。也就是说字母 “B” 比字母 “A"更大,字符串 “Tom” 比字符串 “Tim” 更大(因为第二个位置的字母o在字母i后面——译者注)。这就实现了字母顺序的倒序排序,使得 “Barry” 放在了 “Alex” 之前等等。