這幾次課程的內(nèi)容對(duì)我來(lái)說(shuō)最大的收獲是函數(shù)類型與如何使用閉包讓代碼更加簡(jiǎn)潔。
本次內(nèi)容有:
- 函數(shù)類型
- 閉包
函數(shù)類型
函數(shù)類型:包含參數(shù)和返回類型的簡(jiǎn)寫(xiě)形式,可以像普通變量那樣使用,一般用于函數(shù)式編程. ??(Int,Int) -> Int
舉個(gè)例子:定義一個(gè)計(jì)算函數(shù)calculate來(lái)進(jìn)行+ - * / 運(yùn)算,使用哪種運(yùn)算取決于method 此處method是一個(gè)函數(shù),在這里函數(shù)可以當(dāng)做一個(gè)變量來(lái)使用。
func calculate(x: Double, y: Double, method: (Double, Double) -> Double) -> Double {
return method(x, y)
}
比如我要做加法運(yùn)算:
func calculate(x: Double, y: Double, method: (Double, Double) -> Double) -> Double {
return method(x, y)
}
func add(x: Double, y: Double) -> Double {
return x + y
}
let answer = calculate(x: 5, y: 9, method: add)
這里我們把add函數(shù)當(dāng)做了一個(gè)變量進(jìn)行調(diào)用。但這樣的寫(xiě)法過(guò)于繁瑣,我們可以使用閉包讓代碼更簡(jiǎn)潔,也就是說(shuō)不需要add函數(shù)。
func calculate(x: Double, y: Double, method: (Double, Double) -> Double) -> Double {
return method(x, y)
}
let answer = calculate(x: 5, y: 9) { (x, y) -> Double in
return x + y
}
還可以再簡(jiǎn)潔一點(diǎn):
let answer = calculate(x: 5, y: 9) { $0 + $1 }
如果你想做乘法也沒(méi)問(wèn)題:
let answer = calculate(x: 5, y: 9) { $0 * $1 }
閉包
不得不說(shuō),Swift的閉包的確很棒!這里我們以系統(tǒng)自帶的sorted方法講解閉包。
比如我要對(duì)一個(gè)數(shù)組排序:
let numbers = [2,4,1,8,3,7]
numbers.sorted()
系統(tǒng)自帶的方法只能從小到大排序,如果我想從大到小呢?
let numbers = [2,4,1,8,3,7]
func bigToSmall(x: Int, y: Int) -> Bool{
return x > y
}
numbers.sorted(by: bigToSmall)
Swift追求簡(jiǎn)潔,其實(shí)函數(shù)bigToSmall的定義是多余的??梢允褂瞄]包來(lái)寫(xiě)。
numbers.sorted { (x, y) -> Bool in
return x > y
}
使用閉包表達(dá)式使代碼達(dá)到最簡(jiǎn):
numbers.sorted { $0 > $1 }
$0代表第一個(gè)(前面一個(gè))數(shù),$2代表第二個(gè)數(shù)(后面一個(gè)),$0 > $1表示前面的數(shù)字是否大于后面的一個(gè)數(shù)字。閉包中,函數(shù)類型,返回值類型均可自動(dòng)推斷
拓展:在一個(gè)字符串?dāng)?shù)組中,篩選出符合條件的字符串
let strArray = ["Apple", "Twitter", "dsskdalo", "NNN", "Google"]
//篩選出字符數(shù)量<=5的字符串
let result = strArray.filter { $0.count <= 5 }
result
//篩選出包含字符“l(fā)”的字符串
let result2 = strArray.filter { $0.contains("l") }
result2
//篩選出首字符為“T”的字符串
let result3 = strArray.filter { $0[$0.startIndex] == "T" }
result3