1.类似与OC中的block 。 反向传值 。引起代码的回调 闭包作为函数参数 condition就相当于一个闭包。in 是闭包的一个标志 参数列表和返回值类型 in 闭包所要实现的代码块 func 和 in。
func hasClosureMathes(arr :[Int] ,value :Int ,condition:(num:Int ,value :Int)->Bool)->Bool{
for item1in arr{
if condition(num: item1, value: value){
returntrue
}
}
returnfalse
}
var v1 = hasClosureMathes([2,11,10,10,5,5,3], value: 12) { (num, value) -> Bool in
if num > value
{
return true
}else{
return false
}
}
print(v1)
var v2 = hasClosureMathes([2,11,10,10,5,5,3], value: 1) { (num, value) -> Bool in
if num < value{
returntrue
}else{
returnfalse
}
}
print(v2)
2. 定义一个数组里面 String类型的人名,判断数组里面是否有一个叫小美的人,如果有,返回"大家好,小美在这呢",如果没有,返回"咦,怎么找不到小美"
func hasClosure1Matches (nameArr : [String] ,cb:(name1:String,xName :String )-> Bool) ->String {
for name11in nameArr{
if cb(name1:name11, xName:"小美"){
return "大家好,小美在这呢"
}
}
return"咦,怎么找不到小美"
}
var v3 = hasClosure1Matches(["luce","SuSan","张亮","小美"], cb: { (name1, xName) -> Bool in
if name1 == xName {
returntrue
}
returnfalse
})
print(v3)
3.如果闭包的代码宽里面只有一句代码的话,可以省掉if和返回语句,只要判断就ok拉。
var v4 = hasClosure1Matches(["luce","SuSan","张亮","小美"], cb: { (name1, xName) -> Bool in
name1 == xName })
print(v3)
4.$0表示闭包传进来的第一个参数。$1表示闭包传进来的第二个参数。
var v5 = hasClosure1Matches(["luce","SuSan","张亮","小美"], cb:{
$0 == $1
})
5.在我们实际应用的闭包。
数组的map 属性, 可以遍历数组,然后对其进行相应的操作
a.泛型,比较抽象。他会根据你进行的操作做出判断给你返回相应的值。比如你进行+操作。他就返回 Int 的数组, 如果你进行>判断 ,他就给你返回ture或者是false的值
var numbers = [12,13,22,12,23]
let mapedNnumbers = numbers.map ({
number in
number > 10
})
print(mapedNnumbers)
b.数组的sort方法、这个方法会自动遍历进行前后比较,如果 num1 < num2为真就会返回这两个数,如果为假 ,就会返回这两个交换过得数,从而进行排序。[12,13,22,12,23]
let sortedNumbers = numbers.sort({
(num1 : Int,num2 :Int)->Bool in
num1 < num2 //< 升序排序 >降序
$0 < $1
})
print(sortedNumbers)
总结一下函数作为参数和闭包的区别:
本质都是一样的,引起代码的回调。 只不过是,一个直接调用函数名。闭包是直接传入代码块。在完整的闭包写法中。加入func关键字,他就是一个函数。函数去掉func 加上 in 就变成了闭包。闭包可以省去参数列表和返回值,用$0 $1...去代替。而函数不可以。