美文网首页
Swift---7.闭包

Swift---7.闭包

作者: 阿丶伦 | 来源:发表于2017-02-24 17:28 被阅读15次
    • 闭包(与OC中的block相似)
      • 内联闭包
        • 写法{(para:type)... -> type in statements}(由一对花括号包裹,()里带参数名与参数类型,->后接返回值,在"in"关键字后输入函数声明)
        {
            (a:Int,b:Int) -> Bool in return a>b
        }
        
        • 闭包会根据上下文推断类型(此处以数组的sorted(by:)方法为例,根据方法提示,第一个数组,我们需要传入一个(Int,Int)->Bool的内联闭包,第二个例子中,我们这边没有写参数类型,也没有写返回值类型,是由于Swift可以自动推断参数类型以及返回值类型,所以我们可以省略箭头,包括括号,以更简短的方式来表明我们想要的做法)
        var array = [5,3,2,11,10,8]
        print(array.sorted(by: {(a:Int,b:Int) ->Bool in return a>b}))
        var str = ["vc","aa","dd","cc"]
        print(str.sorted(by:{s1, s2 in return s1>s2}))
        
        • 单行表达式闭包中,如果不写return关键字,单行表达式闭包会隐式的返回这行表达式的结果
        var str = ["vc","aa","dd","cc"]
        print(str.sorted(by:{s1, s2 in s1>s2}))
        
        • 参数名称缩写,Swift为内联闭包中的参数提供了简写的参数名称,表现为:0,1...,我们可以使用它们作为闭包的参数,让我们在编码过程中,不需要输入参数列表,同时,in关键字也可不写
        var str = ["vc","aa","dd","cc"]
        print(str.sorted(by:{$0>$1}))
        
        • 符号函数(画个重点,弄懂了回来补上[捂脸])
        var str = ["vc","aa","dd","cc"]
        print(str.sorted(by:>))
        
      • 尾随闭包
      func testClosures(clour:()->Void) {
      //尾随闭包可以作为函数的最后一个参数
      }
      testClosures() {
      //使用尾随闭包进行调用
      }
      testClosures(clour: {
      //不使用尾随闭包进行调用
      })
      
        - 根据此原理,我们可以把上面内联闭包的sorted方法进行改写,我们也可以把"()"省略
        ```
        var str = ["vc","aa","dd","cc"]
        print(str.sorted(){$0>$1})
        print(str.sorted{$0>$1})
        ```
        - 当我们需要的闭包方法比较长的时候,我们这一使用尾随闭包,来保证我们代码的可读性
        ```
        var array = [5,3,2,11,10,8]
        print(array.sorted(by: {(a:Int,b:Int) ->Bool in if(a>b){return true}else{return false}}))
        print(array.sorted{
            (a:Int,b:Int) ->Bool in
            if(a>b){
                return true
            }else{
            return false
            }
        })
        ```
        - 以函数的map方法,可以更好的说明,```map```方法可以返回一个根据数组进行某种操作的映射.根据```map```方法提供的提示,我们可以看到,在方法后跟随了一个闭包,其中"()"内是每一次遍历数组时得到的值以及类型,一般来说不需要填写类型,只需要给予参数名,让我们方便操作即可,需注意此参数为常数,不可直接改变它的值."T"则是我们想要返回的类型.
        ```
        //numbers.map { (<#Int#>) -> T in
        //<#code#>
        //}
        //返回一个原数组每个值3倍的数组
        let numbers = [3, 6, 9]
        let tribleNumber = numbers.map { (number) -> Int in
            return number*3
        }
        ```
      

    对于闭包,本人理解还有很多不足,希望看文章的人不吝指教,谢谢.

    相关文章

      网友评论

          本文标题:Swift---7.闭包

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