在swift中的闭包等同于OC中的block,它的用途就是在于可以包装一段代码在必要的时候进行调用。
闭包定义:
{(类型列表) -> 返回值 in
// 多条swift语句
// 执行代码 insert coding
}
实际创建闭包代码如下:
var square = {(value1 value1:Int,value2 value2:Int)->Int in
// 代码块
if value1>value2{
return value1
}
return value2 }
注释: 1.此处我们定义一个 square的变量,该变量的类型可以通过闭包的返回值类型进行推导,通过代码得出square的类型为(Int,Int)->Int类型。
2.这段闭包代码的意义是 比较两个数的大小,将最大的那个数返回,并赋值给square
3. 注意闭包中的参数名,如果不定义外部参数名,当我们调用的时候是不会有任何的提示(xcode 7.2,也许版本高了之后会有改进吧,毕竟现在xcode在写swift很多提示都不给出),如果我们给两个参数提供外部名时,当我们调用这个闭包的时候系统会给出提示。
调用闭包代码如下:
var max = square(value1: , value2: )
print(max)
一个完整的闭包表达式是需要定义 形参类型,返回值类型,但是由于在swift中可以根据上下文进行推导参数类型,所以当变量确定类型时,闭包中的新参类型和返回值类型可以省略:
var square1:(Int,Int)->Int = {(value1,value2) in (value1 > value2 ? value1 : value2)
}
注释:1.这段代码初学者可能看着比较费劲,可能不理解(Int,Int)->Int 是什么,它其实就是一个类型,是闭包的类型,这段代码实则就是将闭包中的类型全部写到了变量类型定义处了。初学者在练习的时候可以按照规范进行编写,等熟练的时候可以看这段代码,现在只是作为了解。
2.另外,可以看到 此处的返回值省略了return ,当代码执行体有且只有一行代码的时候,可以将其省略。
3.还可以省略形参名,如果闭包表达式省略了形参名 那么 in 关键值也是可以省略的。此时闭包表达式用 $0 $1 $2...名字来一用第一个、第二个、第三个形参。
闭包可以捕获上下文中的常量和变量
闭包可以访问或修改其所在的上下文中的变量或常量(常量只可以访问,不可以修改),这个过程称之为捕获。即便定义的这些变量或常量的作用域已经不存在了,但是闭包依然可以访问或修改它们。
程序如下
// 定义一个函数,该函数的返回值类型为:()->[String]
func makeArray(ele:String)->()->[String]
{
// 定义一个数组,该数组不包含任何元素
var arr:[String] = []
// 定义一个嵌套方法,该方法返回一个String数组
func addElement()->[String]
{
// 在arr数组中添加一个ele的元素
arr.append(ele)
return arr
} return addElement }
注释:由上面程序可以看出在arrElement()中没有定义任何的参数和变量,但是依然可以访问到arr 和 ele 这是因为它通过上下文捕获到在其所在上下文存在这两个变量或参数,所以arrElement()在没有定义的情况下可以取到.