swift閉包初見

閉包。。曾經在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
}
//****閉包是引用類型****//
相關文章
相關標籤/搜索