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))
自動閉包就是 編譯器自動將表達式轉化成閉包