您的位置:首页 > 移动开发 > Swift

swift学习记录(闭包)

2015-12-18 10:09 295 查看
闭包是可以在代码中传递和使用的自包含的功能模块。可以捕获和存储上下文任何引用常量和变量,也就是关闭这些常量和变量,因此得名“闭包。相当于java
中的匿名内部类、OC中的block。

可以作为表达式、函数参数和函数返回值,闭包表达式的运算结果是一种函数类型。

闭包表达式语法:

{(参数列表)->返回值类型 in

语句组

}

闭包的参数可以使用 常量 、变量、元组和输入输出参数(inout),不提供默认值,参数列表中的最后一个参数,也可以使用可变参数。

in 关键字 引入内联闭包的函数体,表示闭包的参数和返回值类型定义已经完成,闭包函数体即将开始。

多返回值,可以借助元组。

闭包作为函数参数的事例:

/**
参数1:Int 数组
参数2:是一个函数类型的参数
返回值:Int 数组
*/
func getArr(arr:[Int] , pre:(Int)->Bool) ->[Int]{
//定义一个空的可变整形集合
var tempArr = [Int]()
for temp in arr {
if pre(temp){
tempArr += [temp]
}
}
return tempArr;
}

/****      调用函数       ******/
//定义int数组
var intArr = [0,1,2,3,4,5,6]
/**调用 getArr 函数 ,其中第二个参数为闭包*/
var result = getArr(intArr, pre: {(s:Int)-> Bool in

return s>2

})

print(result)
//[3, 4, 5, 6]


闭包的简化方式:

1,类型推断简化

因为 Swift 可以推断出闭包的参数和返回值类型,所以不需要完整格式构造内联闭包。

上面的闭包就可以简写为:

{s in
return s>2
}
2,隐藏return 关键字

如果 闭包内只有一条 return 语句时,可以省略return 关键字,所以上面的闭包还可以在简化为:

{s in s>2}


3,参数名缩写

Swift 为内联函数提供了参数名称缩写功能,通过 $0,$1,$2 顺序使用闭包的参数。

如果使用了参数缩写名称,在函数参数列表中可以省略对闭包的定义,Swift 也会推断闭包参数缩写名称的类型。 in 关键字同样被省略。此时闭包表达式完全由闭包函数体构成。上面的闭包再简化为:

{$0 > 2}


使用闭包的返回值:

闭包表达式的运算结果是函数类型,是有返回值的,所以我们可以直接使用它的返回值

var add = { (str1:String,str2:String) -> String in
return str1+str2
}("hello","word")
print(add)
var add2 = {$0 + $1}("hello","word")
print(add2)
//helloword
//helloword
使用 闭包的返回值,需要在闭包表达式的后面加上小括号(),给闭包传递参数。然后将返回值,赋值给变量add.

尾随闭包

闭包作为函数的参数,而且闭包表达式有很长的情况下,调用函数时,代码的可读性就变的很差,为了增强代码的可读性,这里就需要用到 尾随闭包。就是将闭包写在参数列表括号的后面。

需要注意的是,闭包必须是函数参数列表的最后一个参数。

使用尾随闭包调用上面的 getArr 函数

var result1 = getArr(intArr){(s:Int)-> Bool in return s>2} //尾随闭包
var result2 = getArr(intArr){s in return s>2} //闭包类型推断简化
var result3 = getArr(intArr){s in s>2}  //尾随闭包影藏return
var result4 = getArr(intArr){$0>2} //尾随闭包参数名缩写
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: