在Swfit中,可以通过func定义一个函数,也可以通过闭包表达式定义一个函数
func sum(_ v1 : Int, _ v2: Int) -> {v1 + v2}
var fn = {
(v1:Int,v2:Int) -> Int in
return v1+v2
}
{
(v1:Int,v2:Int) -> Int in
return v1+v2
}(10,20) // 这种写法相当于直接调用闭包了
{
(参数列表) -> 返回值类型 in
函数具体代码
}
闭包表达式的简写

尾随闭包
func addStr(s1:String,s2:String,closure:(String,String)->String)->String{
return closure(s1,s2);
}
定义了一个函数,最后一个参数是一个闭包,这样就可以使用尾随闭包
let bbb = addStr(s1: "22", s2: "333") { c1, c2 in
return c1+c2
} // 这种就是尾随闭包的写法
let aaa = addStr(s1: "hahah", s2: "xixixi",closure:{ (a1,a2) -> String in
return a1+a2
}) // 这种就是通俗的写法
let ccc = addStr(s1: "Hello", s2: "world", closure: {(c1,c2) -> (String) in
return (c1) + (c2)
}) // 这种就是通俗的写法
示例-数组排序
func cmp(i1:Int, i2:Int) -> bool {
return i1>i2
}
var nums = [11,2,18,6,5,68,45]
nums.sort(by:cmp)
nums.sort(by:{
(i1:int,i2:int) -> bool in
return i1< i2
}) // 这个其实是结合了闭包的使用
nums.sort(by: {i1,i2 in return i1<i2}) // 简写
nums.sort(by:{i1,i2 in i1<i2}) // 简写
nums.sort(by:{$0 < $1}) // 简写
nums.sort(by:<) // 简写
nums.sort(){ $0 <$1} //尾随闭包
nums.sort{ $0 < $1} //尾随闭包简写,因为只有一个闭包的参数
忽略参数
func exec(fn:(v1:int,v2:int) -> int) {
print(fn(1,2))
}
exec{
_,_ in return
}
这种写法的场景,主要是在我不想用到接收参数,我就想返回自己想要的数据
闭包

typealias Fn = (int) -> int
func getFn() -> Fn {
var num = 0;
func plus(_ i:int) -> int {
num+= i
return num
}
return plus
}
var fn = getFn()
print(fn(1)) // 1
print(fn(2)) // 3
print(fn(3)) // 6
print(fn(4)) // 10
网友评论