Swift 4中的闭包类似于以块形式组织的自包含函数的闭包,并在诸如C和Objective C语言的任何地方调用。在函数内部定义的常量和变量引用被捕获并存储在闭包中。
以下是定义闭包的通用语法,闭包接受参数并返回数据类型-
{ (parameters) -> return type in statements }
以下是一个简单的示例-
let studname={ print("Welcome to Swift Closures") } studname()
运行上述程序时,我们得到以下输出-
Welcome to Swift Closures
以下闭包接受两个参数并返回Bool值-
{ (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) print (result)
运行上述程序时,我们得到以下输出-
10
通过标准库中已提供的Swift 4保留函数" sorted"实现对字符串进行排序,函数将给定的字符串按升序排序,并以与旧数组中提到的大小和数据类型相同的新数组返回元素,旧数组保持不变。
func ascend(s1: String, s2: String) -> Bool { return s1 > s2 } let stringcmp=ascend(s1: "Swift 4", s2: "great") print (stringcmp)
运行上述程序时,我们得到以下输出-
true
闭包表达式不支持默认值。可变参数和元组也可用作参数类型和返回类型。
let sum={ (no1: Int, no2: Int) -> Int in return no1 + no2 } let digits=sum(10, 20) print(digits)
运行上述程序时,我们得到以下输出-
30
函数语句中提到的参数和返回类型声明也可以由带有'in'关键字的内联闭包表达式函数表示。声明参数和返回类型后," in"关键字用于表示闭包的主体。
在这里,排序函数的第二个参数的函数类型清楚地表明,闭包必须返回Bool值。因为闭包的主体包含返回Bool值的单个表达式(s1> s2),所以没有歧义,可以省略return关键字。
要在表达式闭包中返回Single Expression语句,在其声明部分省略了'return'关键字。
var count:[Int]=[5, 10, -6, 75, 20] let descending=count.sorted(by: { n1, n2 in n1 > n2 }) let ascending=count.sorted(by: { n1, n2 in n1 < n2 }) print(descending) print(ascending)
运行上述程序时,我们得到以下输出-
[75, 20, 10, 5, -6] [-6, 5, 10, 20, 75]
该语句本身明确定义了,当string1大于字符串2时,返回true,否则返回false,因此在这里省略return语句。
考虑两个数字的加法。我们知道加法将返回整数数据类型。因此,已知的类型闭包被声明为-
let sub={ (no1: Int, no2: Int) -> Int in return no1 - no2 } let digits=sub(10, 20) print(digits)
运行上述程序时,我们得到以下输出-
-10
Swift 4自动为内联闭包提供了缩写参数名称,可用于通过名称$0,$1,$2等来引用闭包参数的值。
var shorthand: (String, String) -> String shorthand={ $1 } print(shorthand("100", "200"))
在这里,$0和$1引用闭包的第一个和第二个String参数。
运行上述程序时,我们得到以下输出-
200
Swift 4通过表示$0,$1,$2- $n来帮助用户将内联闭包表示为速记参数名称。
Swift 4仅提供操作员函数作为闭包,从而提供了一种访问成员的简便方法。关键字" 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(<) print(asc)
运行上述程序时,我们得到以下输出-
[-30, -20, 18, 35, 42, 98]
借助"Trailing Closures"来声明将函数的最终参数传递给闭包表达式,它用{}写入函数()的外部,如果无法在一行中内联编写函数,则需要使用它。
reversed=sorted(names) { $0 > $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.substringToIndex(advance($0.startIndex, 2)).uppercaseString } print(stletters)
运行上述程序时,我们得到以下输出-
[NO, EA, WE, SO]
在Swift 4中,捕获常量和变量值是在闭包的帮助下完成的,即使变量不再存在,它也将引用和修改闭包体内那些常量和变量的值。
通过在其他函数的主体中写入function来使用嵌套函数来捕获常量和变量值。
let decrem=calcDecrement(forDecrement: 18) decrem()
在这里, oneDecrement 和Decrement变量都将指向同一内存块作为闭包引用。
func calcDecrement(forDecrement total: Int) -> () -> Int { var overallDecrement=100 func decrementer() -> Int { overallDecrement -= total print(overallDecrement) return overallDecrement } return decrementer } let decrem=calcDecrement(forDecrement: 18) decrem() decrem() decrem()
运行上述程序时,我们得到以下输出-
82 64 46
每次调用函数calcDecrement时,它都会调用decrementer()函数并将值减18,并在函数calcDecrement的帮助下返回输出。此处的calcDecrement充当闭包。
即使函数decrementer()没有任何自变量,默认情况下闭包也通过捕获其现有值来引用变量'overallDecrement'和'total'。
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)