swift语言学习-9. 闭包
swift 9 闭包 闭包在一般的语言中也有,而且用法也差不多,swift中也是有闭包的概念的,这一节来学习swift中的闭包。 什么是闭包闭包(closure),闭包可以捕获和存储其所在上下文中任意常量和变量的引用。 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包。 swift中有个
sorted函数有2个参数,第一个参数是数组,第二个参数传入一个闭包函数。 闭包表达式语法根据上面的一个简单的例子,我们知道来一个闭包实质上也是一个函数,所以我们总结和精简一下,如何定义一个闭包: 闭包一般是这样定义的: { (parameters) -> returnType in //函数体 statements } 闭包表达式语法可以使用 那我们按照这个闭包的定义,重现写一下刚才这个排序数组的例子 闭包的函数体部分由关键字 我们也可以写成一行: r = sorted(names,{ (s1: String,s2: String) -> Bool in return s1 > s2 } ) 根据上下文推断类型 上面的例子中 reversed = sorted(names,{ s1,s2 in return s1 > s2 } ) 看,是不是简洁多了。 单表达式闭包隐式返回单行表达式闭包可以通过隐藏return关键字来隐式返回单行表达式的结果,如上版本的例子可以改写为: PS: swift文档中是这样写的,但是发现报错了,不能运行:ambiguous use the operator > (含糊的操作符>) 尾随闭包如果将一个很长的闭包表达式作为一个参数参数一个函数,这样可读性就会很差,而且写起来很蛋疼。所以,就出现了尾随闭包,尾随闭包是一个书写在函数括号之后的闭包表达式,函数支持将其作为最后一个参数调用。 所以刚才的那个例子,也能这样写: 来一个尾随闭包原始的写法: 捕获值 闭包可以在其定义的上下文中捕获 Swift最简单的闭包形式是嵌套函数,也就是定义在其他函数的函数体内的函数。嵌套函数可以捕获其外部函数所有的参数以及定义的常量和变量。 看这个例子: ()-> Int 的函数。
函数题内,声明了变量runningTotal 和一个函数incrementor。 incrementor函数并没有获取任何参数,但是在函数体内访问了runningTotal和amount变量。这是因为其通过捕获在包含它的函数体内已经存在的runningTotal和amount变量而实现。 由于没有修改amount变量,incrementor实际上捕获并存储了该变量的一个副本,而该副本随着incrementor一同被存储。 所以我们调用这个函数: let incrementByTen = makeIncrementor(forIncrement: 10) incrementByTen() // 返回的值为10 incrementByTen() // 返回的值为20 incrementByTen() // 返回的值为30 会累加。 闭包是引用类型 上面的例子中,incrementByTen是常量,但是这些常量指向的闭包仍然可以增加其捕获的变量值。 无论您将函数/闭包赋值给一个常量还是变量,您实际上都是将常量/变量的值设置为对应函数/闭包的引用。 上面的例子中,incrementByTen指向闭包的引用是一个常量,而并非闭包内容本身。 这也意味着如果您将闭包赋值给了两个不同的常量/变量,两个值都会指向同一个闭包: let alsoIncrementByTen = incrementByTen alsoIncrementByTen() // 返回的值也为50 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |