亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Swift2.0(10)閉包

發布時間:2020-07-15 09:39:43 來源:網絡 閱讀:224 作者:ymanmeng123 欄目:移動開發
  • 閉包

什么是閉包?

     是一個自包含的功能塊,可以在任何地方使用這個功能塊,且可以將其傳來傳去

     閉包可以捕獲和存儲其所在上下文的任意常量和變量的引用

     其意義相當于函數及block的綜合體

三種形式:

     全局函數是一個有名字但不會捕捉任何值的閉包

     嵌套函數是一個有名字并可以捕獲其封閉函數域內值的閉包

     閉包表達式是一個利用輕量級語法所寫的可以捕獲上下文中變量或常量的沒有名字的閉包

  • 閉包表達式

何時使用閉包表達式?

     函數的參數類型為函數類型時,實參使用閉包

閉包表達式擁有簡潔的風格,并在常見場景中可以實現語法優化,如:

     利用上下文推斷參數和返回值類型

     單表達式閉包可以省略return關鍵字

     參數名稱簡寫

     尾閉包語法

實現一個排序功能,傳遞一個數組和一個比較方式的函數類型參數

利用函數實現的方式:

     func sort(inout arr:[String], cmpFunc:(String,String)->Bool{

         let len = arr.count

         for var i:Int = 0; i<len; i++ {

             for var j:Int=0; j<len-i-1; j++ {

                 if ( cmpFunc(arr[j], arr[j+1]) ) {

                     let tmp:String = arr[j]

                     arr[j] = arr[j+1]

                     arr[j+1] = tmp

                 }

             }

         }

     }

     func cmp(s1:String, s2:String) -> Bool {

         return s1 > s2

     }

     var names:[String] = ["Chris", "Alex", "Ewa", "Barry"]

     sort(&names, cmpFunc: cmp)

     這樣做的好處是:可以傳遞不同的cmp函數,實現自定義的排序依據

使用閉包表達式代替函數:

      sort(&names, cmpFunc: {(s1:String, s2:String)->Bool in

         return s1 > s2

     })

     函數類型的參數,使用閉包表達式使程序變得更加簡潔

     完整的閉包表達式語法:

     { 函數類型 in 閉包代碼 }

根據上下文簡化,去掉閉包的函數類型:

     sort(&names, cmpFunc: {s1, s2 in

         return s1 > s2

     })

Swift可以省略參數名,使用占位符代替參數名

     sort(&names, cmpFunc: { return $0 > $1 })

單語句閉包比表達式,去掉return關鍵字

     sort(&names, cmpFunc: { $1 > $2})

最后的簡化,依賴于運算符重載:

     sort(&names, cmpFunc: >)

  • 尾閉包

什么是尾閉包?

     當閉包表達式作為函數的最后一個參數時的一種書寫方式,如:

     sort(&names) { (s1, s2) -> Bool in

         return s1 > s2

     }

     即將閉包表達式這個參數拿到參數列表后面去實現,這種方式比較易于代碼的編寫

  • 捕獲值

閉包可以在其定義的上下文中捕獲常量或變量

即使定義這些常量和變量的原域已經不存在,閉包內仍可以引用和修改這些值。

如:

     func myFuncTwo(xFunc:()->Void{

         xFunc()

     }

     func myFuncOne() {

         var a:Int = 5

         myFuncTwo { () -> Void in

              a++

         }  

         print(a)

     }

     myFuncOne()     //6

再如內嵌函數也是一種閉包,且可以訪問內嵌所在的作用域內的變量或常量

     func myFuncOne() {

         var a:Int = 5

         func myFuncTwo() {

             a++

         }

         myFuncTwo()

         print(a)     //6

         myFuncTwo()

         print(a)     //7

     }


向AI問一下細節
推薦閱讀:
  1. Python 閉包
  2. lua 閉包

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乌鲁木齐市| 巨鹿县| 华亭县| 乌拉特后旗| 淅川县| 乃东县| 合江县| 信丰县| 故城县| 札达县| 东宁县| 贡嘎县| 海宁市| 雅安市| 南涧| 新泰市| 龙州县| 孟村| 涿鹿县| 郑州市| 嘉鱼县| 信宜市| 盐源县| 郴州市| 平顶山市| 遂平县| 秦安县| 河间市| 邻水| 卫辉市| 黎城县| 鹤庆县| 乐平市| 雅安市| 修水县| 平远县| 健康| 广东省| 博客| 澄迈县| 高要市|