閉包。。曾經在javaScript中「大顯身手,霸佔內存」的傳奇方法,現在在swift中又出現了,最簡單的閉包就是函數內部的函數引用了該函數的局部變量或常量,有點點拗口,閉包的功能確實很強大,偉大的jQuery就是閉包的產物java
在js中的閉包正則表達式
function add(name){ var count = 0 ; function test(){ alert(name+"="+count); } return test; } //當外部函數執行完以後,會返回一個函數 var newFunc = add("小強"); newFunc();//打印輸出 //當外部函數執行完後,局部變量並不會被gc回收,由於返回的函數引用了外部函數的變量,致使變量的引用計數不是0
在swift中,閉包形式也是這樣的swift
func add(name: String) ->()->Int { var count = 0 func test() ->Int{ println("\(name)") return ++count } return test } //函數執行跟js中的調用同樣同樣地 //在全局函數中有個sort函數,就是以閉包的方法對數組進行排序的,返回一個新的有序數組 let names = ["A","E","F","C","B"] //sort函數須要傳入兩個參數,第一個參數爲數組,第二個參數其實就是一個函數,但它在內部實現應該是引用了數組中的///屬性 var newArray = sort(names,function) func sortFunction(s1: String, s2: String) -> Bool{ return s1 > s2 } var newArray = sort(names,sortFunction) //內聯閉包表達式方法,能夠簡化以上操做//很是類似匿名函數 newArray = sort(names,{(s1: String,s2: String)->Bool in return s1>s2}) //閉包表達式方法{(參數) -> returnType in statements} //swift 的強大之處在於,能夠根據本身的須要去推斷函數的參數類型,返回類型,因此上的內聯函數參數類型能夠省略,///返回類型也能夠省略 newArray = sort(names,{s1,s2 in return s1>s2}) //單表達式閉包隱式返回,單行表達式閉包能夠經過隱藏return關鍵字來隱式返回單行表達式的結果,如上版本的例子能夠改//寫爲: newArray = sort(names,{s1,s2 in s1>s2}) //我感受這麼寫對代碼的可讀性有點影響,最好仍是寫上return //參數名縮寫,swift爲內聯函數提供了這個方法,能夠經過$0,$1,$3..順序的去調用參數,(這個是借鑑的正則表達式的//方法麼) //以上函數能夠寫成 newArray = sort(names,{$0>$1}) //文檔中還有一個更簡單的寫法,swift 的string定義了 > 的字符串實現,接收兩個string參數,返回boolean //swift會自動推斷出你想用>的函數實現,更簡潔寫法 newArray = sort(names,>) //當看到尾隨閉包時,感受好新鮮的,感受這種方式可能用的比較廣,自我感受 func trailClosures(closure: () -> ()){ //函數接收一個返回函數的函數類型的函數 } //不使用尾隨閉包,用內聯函數去傳參 trailClosures({()->() in return {() in 。。。}})//不知道這樣寫對不對,沒機器測試啊,苦逼。。。。中.. //若是使用尾隨閉包, trailClosures(){ } //當參數只是一個函數類型時,函數的()也能夠省略 trailClosures{ } //數組有個map方法,來看一下用尾隨閉包去寫 var number = [1,2,3,4] number.map({ (a: Int) ->String in return String(a) })//內聯閉包的寫法 //尾隨閉包的寫法 var newArray = number.map{ (var num) -> String in var output = "" while num >0 { // output 處理 } return output } //****閉包是引用類型****//