美文网首页Swift学习笔记
闭包表达式(closure Expression)

闭包表达式(closure Expression)

作者: aven_kang | 来源:发表于2022-02-19 14:12 被阅读0次

在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
  函数具体代码
}

闭包表达式的简写

截屏2022-02-17 下午3.12.59.png
尾随闭包
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
}
这种写法的场景,主要是在我不想用到接收参数,我就想返回自己想要的数据

闭包

截屏2022-02-18 下午2.58.46.png
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
从上面的代码来看,在这个闭包中,num变量,已经被闭包捕获了,存放在了一个另外的堆空间,这时候,所以后面的打印中,num数字都没有被重置。 var fn这个方法,已经分配了单独的堆空间给num,num就属于这个fn这个方法了,所以不管调用几次fn()这个方法,num都是一直在计数。

相关文章

网友评论

    本文标题:闭包表达式(closure Expression)

    本文链接:https://www.haomeiwen.com/subject/jjkslrtx.html