这几次课程的内容对我来说最大的收获是函数类型与如何使用闭包让代码更加简洁。
本次内容有:
- 函数类型
- 闭包
函数类型
函数类型:包含参数和返回类型的简写形式,可以像普通变量那样使用,一般用于函数式编程. (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的闭包的确很棒!这里我们以系统自带的sorted
方法讲解闭包。
比如我要对一个数组排序:
let numbers = [2,4,1,8,3,7]
numbers.sorted()
系统自带的方法只能从小到大排序,如果我想从大到小呢?
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”的字符串
let result2 = strArray.filter { $0.contains("l") }
result2
//筛选出首字符为“T”的字符串
let result3 = strArray.filter { $0[$0.startIndex] == "T" }
result3