资源预览内容
第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
第9页 / 共10页
第10页 / 共10页
亲,该文档总共10页全部预览完了,如果喜欢就下载吧!
资源描述
深入理解Swift语言中的闭包机制在 Swift 中的闭包类似于结构块,并可以在任何地方调用,它就像 C 和 Objective C 语言内置的函数。 函数内部定义的常数和变量引用可被捕获并存储在闭包。函数被视为封闭的特殊情况,它有 3 种形式。 在 Swift 语言闭合表达式,如下优化,重量轻语法风格,其中包括: 1.推导参数并从上下文菜单返回值的类型2.从单封表达的隐性返回3.简略参数名称4.尾部闭包语法 语法 下面是一个通用的语法定义用于闭包,它接受参数并返回数据的类型: 复制代码 代码如下: (parameters) - return type in statements 下面是一个简单的例子: 复制代码 代码如下: let studname = println(Welcome to Swift Closures) studname() 当我们使用 playground 运行上面的程序,我们得到以下结果 Welcome to Swift Closures 以下闭包接受两个参数并返回一个布尔值: 复制代码 代码如下: (Int, Int) - Bool in Statement1 Statement 2 - Statement n 下面是一个简单的例子: 复制代码 代码如下: let divide = (val1: Int, val2: Int) - Int in return val1 / val2 let result = divide(200, 20) println (result) 当我们使用 playground 运行上面的程序,我们得到以下结果 在闭包中的表达式 以便捷的方式命名来定义代码块可以通过嵌套函数实现的。取而代之代表整个函数声明及名称构造用来表示函数。代表函数的语法清晰,简短声明是通过封闭的表达来实现的。 升序排列程序 排序字符串是 Swift 中保留的函数 “sorted”,这是在标准库中已提供实现。该函数将所述给定的字符串进行递增顺序排序并返回具有相同的尺寸,并在旧数组中相同数据类型的一个新的数组的元素。旧的数组保持不变。 两个参数的排序在函数内部表示: 已知类型的值表示为数组 数组的内容 (Int,Int) ,并返回一个布尔值(Bool),如果数组排序不好就会返回true,否则将返回false。 普通函数带输入字符串被写入,并传递给排序函数获得字符到新的数组,如下面所示: 复制代码 代码如下: func ascend(s1: String, s2: String) - Bool return s1 s2 let stringcmp = ascend(swift, great) println (stringcmp) 当我们使用 playground 运行上面的程序,我们得到以下结果 复制代码 代码如下: true 最初的数组排序给定为 Swift 和 great。函数用来数组排序被声明为字符串数据类型,并且返回类型为布尔型。 两个字符串进行比较,并以升序排序,并存储在新的数组。如果排序执行成功,该函数将返回true;否则将返回 false。 闭包表达式语法用法 常量参数: 可变参数 和 inout 参数 闭包表达不支持的默认值。可变参数和参数元组也可以用来作为参数类型和返回类型。 复制代码 代码如下: let sum = (no1: Int, no2: Int) - Int in return no1 + no2 let digits = sum(10, 20) println(digits) 当我们使用 playground 运行上面的程序,我们得到以下结果 在函数声明中提到的参数和返回类型声明,也可通过使用 in 关键字内联闭包表达式函数表示。 一旦声明参数及其返回类型“in”关键字,则用于表示闭包体。 单一表达式隐式返回 在这里,排序函数的第二个参数的函数类型明确指出,一个布尔值必须由闭包返回。因为闭包体内含有一个表达式(s1 s2)返回一个布尔值, 不会出现歧义,其返回关键字可以省略。 要返回一个表达式语句在闭包中, “return” 关键字在其声明部分被省略。 复制代码 代码如下: let count = 5, 10, -6, 75, 20 var descending = sorted(count, n1, n2 in n1 n2 ) var ascending = sorted(count, n1, n2 in n1 Int in return no1 - no2 let digits = sub(10, 20) println(digits) 当我们使用 playground 运行上面的程序,我们得到以下结果 -10 声明简写参数名称作为闭包 Swift 自动提供简写参数名内联闭包, 可以使用由 $0,$1,$2 等等名称,指的是封闭的参数值。 复制代码 代码如下: var shorthand: (String, String) - String shorthand = $1 println(shorthand(100, 200) 在这里,$0 和 $1 参考闭包的第一和第二个字符串参数。 当我们使用 playground 运行上面的程序,我们得到以下结果200 Swift 方便用户来表示内嵌闭包为缩写参数名为:$0, $1, $2 - $n. 闭包参数列表中被省略定义部分,当我们表示内部闭包表达式简写参数名。 根据函数类型简写参数名称将被导出。由于简写参数表达体所定义的 in 关键字被省略。 闭包作为操作函数 Swift 提供了一种简单的方法访问的成员,只需提供操作符函数作为闭包。 在前面的例子关键字“Bool”是用来比较两个字符串,相等返回“true”,否则返回“false”。 表达式即使在闭包中变得简单在操作函数: 复制代码 代码如下: let numb = 98, -20, -30, 42, 18, 35 var sortedNumbers = numb.sorted( (left: Int, right: Int) - Bool in return left right ) let asc = numb.sorted( $1 其中 $0 $1 表示为外部(名称)声明尾随闭包。 复制代码 代码如下: import Foundation var letters = North, East, West, South let twoletters = letters.map( (state: String) - String in return state.substringToIndex(advance(state.startIndex, 2).uppercaseString ) let stletters = letters.map() $0.substwww.visa158.comringToIndex(advance($0.startIndex, 2).uppercaseString println(stletters) 当我们使用 playground 运行上面的程序,我们得到以下结果 NO, EA, WE, SO 捕获值和引用类型 在闭包的帮助下 Swift 完成捕捉常量和变量的值。它还参考修改值,即使常量和变量在闭包体已经不存。 捕获常数和变量值是通过使用嵌套函数写入函数,这是使用其它函数体来实现的: 1.一个嵌套函数捕获2.外部函数参数3.捕捉常量和外部函数中定义的变量 Swift 中当常量或变量在函数中声明,引用到变量也自动地被闭合创建。它也提供工具来引用两个以上的变量作为同一闭合如下: 复制代码 代码如下: let decrem = calcDecrement(forDecrement: 18) decrem() 在这里,oneDecrement 和 递减变量都指向同一个内存块闭合参考。 复制代码 代码如下: func calcDecrement(forDecrement total: Int) - () - Int var overallDecrement = 100 func decrementer() - Int overallDecrement -= total println(overallDecrement) return overallDecrement return decrementer let decrem = calcDecrement(forDecrement: 18) decrem() decrem() decrem() 当我们使用 playground 运行上面的程序,我们得到以下结果: 826446 当每一个外部函数 calcDecrement 调用时都会调用 decrementer()函数 并通过值 18 递减,并在外部函数 calcDecrement 的帮助下返回结果。在这里,calcDecrement 作为一个闭合。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号