闭包-简洁版(Swift)

本文深入探讨了闭包与函数的概念及其在编程语言中的实现方式,通过实例展示了如何利用闭包来创建增量器函数,同时介绍了类型推导、参数默认值以及运算符函数在闭包中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://ju.outofmemory.cn/entry/103446

闭包内容挺多的,一次看多了晕菜,直接来个简洁版的,还有疑惑看其他帖子去

  1. 闭包(closure)与函数(function)
    很多语言都有闭包的概念,比如C中的block,C++的lamda //Global functions, nested functions, and closure 可以认为函数是特殊形式的闭包,也可以认为闭包是匿名函数,二者基本是通用的。
    无论函数还是闭包,在引用外部变量时,如果变量是在栈上(比如,局部变量),会将其拷贝到堆上,这也是所有语言中的做法。
    1. Global function

       var c = 1
       func inc() -> Int {
           return ++c
       }
    2. Nested function

       func makeIncrementor() -> (()->(Int)){
           var c = 1
           func inc() -> Int {
               c++
               return c
           }
           return inc
       }  
    3. Closure

       func makeIncrementor(var c:Int) -> (()->(Int)){
           var c = 1
           return { () -> Int in
               c++
               return c
           }
       }
  2. 闭包的基本形式

     { (parameters) -> (return type) in
         statements
     }
     let reversed = sort(["Jim", "Kate"], { (s1:String, s2:String) -> Bool in
         return s1 > s2
         })// 闭包的函数体部分由关键字 in 引入// 该关键字表示闭包的参数和返回值类型定义已经完成,闭包的函数体即将开始
  3. 类型推导
    可以由上下文推导传入和传出的参数类型,比如sort的原型是 func sort(array: T[], pred: (T, T) –> Bool) –> T[]
    根据第一个String[]就可以知道s1, s2是String类型了,返回值s1>s2自然是Bool类型

     let reversed2 = sort(["Jim", "Kate"], { s1, s2 in
         let a = s1.utf16count
         return s1 > s2
         })
  4. 如果只有一条语句的话,return可省略,直接将该语句的值返回,但多条语句return不能省略

     let reversed3 = sort(["Jim", "Kate"], { s1, s2 in
         s1 > s2
         })
  5. 如果不写参数名称,默认是$0, $1,…

     let reversed4 = sort(["Jim", "Kate"], {
         $0 > $1
         })
  6. 在这里还可以直接使用运算符函数operator function

     let reversed5 = sort(["Jim", "Kate"], >)
  7. 跟function一样,closure的参数默认为let,可以使用var修改

  8. closure是reference type

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值