第三周第二天
函數作為參數,匿名函數(閉包)尾隨閉包
func sum(a: Int, _ b: Int) -> Int {
return a + b
}
func mul(a: Int, _ b: Int) -> Int {
return a * b
}
// 在Swift中函數是一種類型
// 這也就意味著函數可以作為變量或常量的類型
// 同理函數也可以作為另一個函數的參數或返回值
func foo(array: [Int], fn: (Int, Int) -> Int) -> Int {
var sum = array[0]
for x in array[1..<array.count] {
sum = fn(sum, x)
}
return sum
}
let a = [1, 2, 3, 4, 5]
// 當調用foo函數時第二個參數可以傳什么?
// 1. 所有自定義的(Int, Int) -> Int類型的函數
print(foo(a, fn: sum))
// 2. 傳入已有的二元運算符: +-*/%(因為運算符也是函數)
print(foo(a, fn: +))
// 3. 傳入匿名函數(閉包)
// 3.1 完整的閉包寫法
print(foo(a, fn: { (a, b) -> Int in
return a + b
}))
// 3.2 省略掉類型和不必要的括號
print(foo(a, fn: { a, b in a + b }))
// 3.3 省略參數名
print(foo(a, fn: { $0 + $1 }))
// 3.4 尾隨閉包
print(foo(a) { (a, b) -> Int in
return a + b
})
print(foo(a) { $0 + $1 })
閉包,尾隨閉包
var array = ["game", "abacus", "hello", "cat", "good", "internationalization", "chaos", "dislike", "zealot", "young"]
// array.sortInPlace(>)
array.sortInPlace({ $0 > $1 })
// array.sortInPlace() { $0 > $1 }
// array.sortInPlace { $0 > $1 }
// 如果函數的最后一個參數是閉包可以寫成尾隨閉包的形式
// 也就是將閉包放到函數參數的圓括號外面寫在一對花括號中
// 如果函數后面有尾隨閉包且函數的圓括號中沒有參數
// 那么函數的圓括號也可以省略(僅限于有尾隨閉包的場景)
array.sortInPlace {
if $0.characters.count == $1.characters.count {
return $0 < $1
}
return $0.characters.count < $1.characters.count
}
print(array)
數組的過濾,縮減,映射
let array = [23, 37, 96, 55, 40, 92, 68, 88]
// 1. 過濾
let newArray1 = array.filter { $0 > 50 }
print(newArray1)
let newArray2 = array.filter { $0 % 2 == 0 }
print(newArray2)
// 2. 映射
let newArray3 = array.map { $0 * $0 }
print(newArray3)
let newArray4 = array.map { sqrt(Double($0)) }
print(newArray4)
// 3. 縮減
let result1 = array.reduce(0, combine: +)
print(result1)
let result2 = array.reduce(1, combine: *)
print(result2)
let result3 = array.reduce(array[0]) {
$1 > $0 ? $1 : $0
}
print(result3)
let strArray = ["I", "love", "you"]
let result4 = strArray.reduce("") { $0 + " " + $1 }
print(result4)