這幾次課程的內容對我來說最大的收獲是函數類型與如何使用閉包讓代碼更加簡潔着逐。
本次內容有:
- 函數類型
- 閉包
函數類型
函數類型:包含參數和返回類型的簡寫形式,可以像普通變量那樣使用,一般用于函數式編程. ??(Int,Int) -> Int
舉個例子:定義一個計算函數calculate
來進行+ - * / 運算,使用哪種運算取決于method
此處method
是一個函數清蚀,在這里函數可以當做一個變量來使用。
func calculate(x: Double, y: Double, method: (Double, Double) -> Double) -> Double {
return method(x, y)
}
比如我要做加法運算:
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
函數當做了一個變量進行調用懂昂。但這樣的寫法過于繁瑣千所,我們可以使用閉包讓代碼更簡潔狂魔,也就是說不需要add
函數。
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
}
還可以再簡潔一點:
let answer = calculate(x: 5, y: 9) { $0 + $1 }
如果你想做乘法也沒問題:
let answer = calculate(x: 5, y: 9) { $0 * $1 }
閉包
不得不說淫痰,Swift的閉包的確很棒最楷!這里我們以系統(tǒng)自帶的sorted
方法講解閉包。
比如我要對一個數組排序:
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追求簡潔,其實函數bigToSmall
的定義是多余的火俄》附ǎ可以使用閉包來寫。
numbers.sorted { (x, y) -> Bool in
return x > y
}
使用閉包表達式使代碼達到最簡:
numbers.sorted { $0 > $1 }
$0
代表第一個(前面一個)數瓜客,$2
代表第二個數(后面一個)适瓦,$0 > $1
表示前面的數字是否大于后面的一個數字。閉包中忆家,函數類型犹菇,返回值類型均可自動推斷
拓展:在一個字符串數組中,篩選出符合條件的字符串
let strArray = ["Apple", "Twitter", "dsskdalo", "NNN", "Google"]
//篩選出字符數量<=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