Swift 闭包
在本教程中,您将通过实例了解 Swift 闭包。
在 Swift 中,闭包是一种特殊类型的函数,没有函数名。例如,
{print("Hello World")}
在这里,我们创建了一个打印 Hello World 的闭包。
在学习闭包之前,请确保了解 Swift 函数。
Swift 闭包声明
我们不使用 func 关键字创建闭包。下面是声明闭包的语法:
{ (parameters) -> returnType in// statements}
在这里,
- parameters - 传递给闭包的任何值
- returnType - 指定闭包返回的值的类型
- in(可选)-用于将 parameters/returnType 与封闭体分离
让我们看一个例子,
var greet = {print("Hello, World!")}
在这里,我们定义了一个闭包,并将其分配给名为 greet 的变量。{} 中包含的语句是闭包体。
要执行此闭包,我们需要调用它。下面是我们如何结束。
// call the closuregreet()
闭包只打印文本 Hello World。
实例:闭包
// declare a closurevar greet = {print("Hello, World!")}// call the closuregreet()
结果如下:
Hello, World!
在上面的实例中,我们定义了一个闭包,并将其分配给名为 greet 的变量。
当我们调用闭包时,会执行闭包内的 print() 语句。
闭包参数
与函数类似,闭包也可以接受参数。例如,
// closure that accepts one parameterlet greetUser = { (name: String) inprint("Hey there, \(name).")}// closure callgreetUser("Delilah")
结果为:
Hey there, Delilah.
在上面的实例中,我们为 greetUser 变量指定了一个闭包。
在闭包内部,(name: String) 指定闭包接受名为的 String 类型参数。请注意,我们在中使用了将闭包参数与主体分开。
另外,请注意闭包的调用
greetUser("Delilah")
这里,我们向闭包传递了一个字符串值 "Delilah"。
最后,执行闭包内的语句。
闭包返回值
Swift 闭包可能返回值,也可能不返回值。如果我们希望闭包返回一些值,我们需要提到它的返回类型并使用 return 语句。例如,
// closure definitionvar findSquare = { (num: Int) -> (Int) invar square = num * numreturn square}// closure callvar result = findSquare(3)print("Square:",result)
结果如下:
Square: 9
在上面的例子中,我们定义了一个返回数字平方的闭包。注意闭包定义,
var findSquare = { (num: Int) -> (Int) in...return square}
这里,(num: Int) -> (Int) 表示闭包
(num: Int)- 表示整数类型的参数-> (Int)- 表示 Int 类型的闭包返回值- return square - 闭包内的
return语句
返回的值存储在 result 变量中。
闭包作为函数参数
在 Swift 中,我们可以创建一个接受闭包作为参数的函数。
// define a functionfunc grabLunch(search: () -> ()) {…// closure callsearch()}
这里,
search - 函数参数
() -> ()- 表示闭包的类型search()- 从函数内部调用闭包
现在,要调用此函数,我们需要传递一个闭包作为其参数。
// function callgrabLunch(search: {print("Alfredo's Pizza: 2 miles away")})
实例:闭包作为函数参数
// define a function and pass closurefunc grabLunch(search: ()->()) {print("Let's go out for lunch")// closure callsearch()}// pass closure as a parametergrabLunch(search: {print("Alfredo's Pizza: 2 miles away")})
结果如下:
Let's go out for foodAlfredo's Pizza: 2 miles away
尾随闭包(Trailing Closure)
在尾随闭包中,如果函数接受闭包作为其最后一个参数,
// function definitionfunc grabLunch(message: String, search: ()->()) {...}
我们可以通过将闭包作为函数体传递来调用函数,而不必使用参数的名称。例如,
// calling the functiongrabLunch(message:"Let's go out for lunch") {// closure body}
在这里,{…} 中的所有内容都是闭包体。
实例:尾随闭包
func grabLunch(message: String, search: ()->()) {print(message)search()}// use of trailing closuregrabLunch(message:"Let's go out for lunch") {print("Alfredo's Pizza: 2 miles away")}
结果如下:
Let's go out for lunchAlfredo's Pizza: 2 miles away
在上面的实例中,grabLunch() 函数接受闭包搜索:() -> ()。这里,闭包是函数的最后一个参数。
因此,我们通过传递闭包参数作为函数定义来调用函数。
grabLunch(message:"Let's go out for lunch") {print("Alfredo's Pizza: 2 miles away")}
自动闭包
// using {}display(greet:{print("Hello World!")}// without using {}display(greet: print("Hello World!"))
要在不使用大括号的情况下传递闭包参数,必须在函数定义中使用 @autoclosure 关键字。例如,
func display(greet: @autoclosure () -> ()) {...}
这里,@autoclosure 会自动添加花括号。
实例:自动闭包
Hello World!
注意:我们不能向自动闭包传递参数。如果这样做,会产生错误:argument type of @autoclosure parameter must be '()'