9 閉包——《Swift3.0從入門到出家》

8  閉包數組

 

Swift語言中能夠使用一塊獨立代碼塊替代函數的定義,稱獨立的代碼塊爲閉包閉包

閉包格式爲:app

{(參數列表)->返回值類型    indom

執行語句函數

}spa

例子:排序

<1>使用閉包實現兩個數的和字符串

var sum:(Int,Int) ->Int = {(a:Int, b:Int)->Int in return a + b}編譯器

<2>使用閉包實現一個整數和一個字符串的拼接,將拼接的結果返回io

var append  = {(num:Int,str:String) ->String in return 「\(num)」 + str}

<3>使用閉包實現數組升序排序(借用上節的排序函數)

sortArr(&array,method:{(num1:Int,num2:Int)->Bool in return num1 > num2})

當函數的形參是函數類型時,形參的傳值直接使用閉包完成

<4>使用閉包獲取數組中大於0的數據個數

let count  = {(arr:[Int])->Int in 

var n = 0

for i  in arr{

if i > 0{

n += 1

}

}

return count

}

var array = [10,2,3,-3,3,-4]

print(count(array))

 

 

閉包的簡化(closure)

<1>當執行語句只有一個表達式的時候 return能夠省略

var closure  = {(a:Int,b:Int)->Int in 

a > b ?  a : b

}

<2>當執行語句只有一個表達式並且表達式的結果類型能夠推斷出來,那麼return關鍵字和返回值類型能夠同時缺省

var closure = {(a:Int,bInt) in

a > b ? a : b

}

<3>當參數的類型已知,而且知足上述兩個條件的時候,參數的名稱能夠缺省,參數的類型能夠缺省,返回值類型能夠缺省,return關鍵字能夠缺省,in也能夠缺省

 

var closure: (Int,Int)->Int = {$0  > $1 ? $0 : $1}

 

<4>當參數個數爲兩個,而且知足<3>的條件,閉包中直接添加運算符號就能夠

sortArr(&array,method: <)

 

尾隨閉包

當函數最後一個形參是函數類型的變量,對函數類型的變量賦值的時候須要使用閉包,那麼閉包傳值的書寫位置能夠放在全部參數列表以外,不放在參數列表的最後位置,咱們稱這種寫法爲尾隨閉包

 

好比上節提到的排序能夠寫成:sortArr(&arr){$0 > $1}

例子:定義函數實現兩個數的差和和

func sumAAndB(a:Int,b:Int,mehod:(Int,Int)->Int){

print(method(a,b))

}

sumAAndB(10,b:20,method:{(a:Int,b:Int)->Int in //初始寫法

return a + b

})

sumAAndB(100,b:200,method: - ) //簡化後的閉包

sumAAndB(0,b:10){$0 - $1} //寫成尾隨閉包

擴展

自動閉包: 函數的形參是函數類型 在函數類型的形參前添加@autoclosure 向該形參傳遞的閉包 就被稱爲自動閉包

 

自動閉包使用的條件:函數的參數列表爲空 ()->返回值類型

 

//定義函數爲數組賦值

func createArr(count: Int,@autoclosure function:()->Int)->[Int] {

    //count 表示數組的元素個數

  //function 一個函數類型的參數 在function指向的函數中對數組的每個元素賦值 數組的元素都是Int類型 因此將賦的每個值反饋回來 添加到新的數組中

    var dataArr: [Int] = []

    for _ in 0..<count {

        dataArr.append(function())

    }

    return dataArr

}

print(createArr(5, function:Int(arc4random()) % 100))

 

自動閉包就是 編譯器自動將表達式轉化成閉包

相關文章
相關標籤/搜索