在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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函数需要两个参数:
因为是排序一个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 } ) |
请发表评论