91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

金湖县| 丹阳市| 玛纳斯县| 合山市| 丹棱县| 高碑店市| 原阳县| 鄂州市| 莱阳市| 金乡县| 齐河县| 霍州市| 同仁县| 泸水县| 巴里| 万山特区| 左权县| 子洲县| 修武县| 茌平县| 囊谦县| 会昌县| 寿阳县| 裕民县| 屏东县| 安丘市| 丽水市| 康乐县| 吴堡县| 南漳县| 乐业县| 琼海市| 永年县| 乡宁县| 大港区| 建昌县| 虎林市| 东乌珠穆沁旗| 固镇县| 宁波市| 洛扎县|