中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

台湾省| 文登市| 陆丰市| 鄂托克旗| 凌源市| 吕梁市| 廊坊市| 永仁县| 仪陇县| 卫辉市| 土默特左旗| 彭水| 海宁市| 清涧县| 延寿县| 湘潭县| 芜湖县| 元阳县| 搜索| 临清市| 临澧县| 苍溪县| 湟中县| 通渭县| 甘泉县| 玉溪市| 安塞县| 遂宁市| 电白县| 繁昌县| 民县| 英吉沙县| 子洲县| 栾川县| 南和县| 萨迦县| 绍兴市| 沐川县| 绥滨县| 凌云县| 桃园市|