一个朴实无华的目录
- 今日学习内容:
- 1.Swift 闭包
- 1.1闭包定义
- 1.2闭包实例
- 1.3闭包表达式
- 1.3.1sorted 方法:据您提供的用于排序的闭包函数将已知类型数组中的值进行排序。
- 1.3.2参数名称缩写:直接通过$0,$1,$2来顺序调用闭包的参数。
- 1.3.3运算符函数
- 1.4尾随闭包:书写在函数括号之后的闭包表达式
- 1.5捕获值:嵌套函数可以捕获其外部函数所有的参数以及定义的常量和变量。
今日学习内容:
1.Swift 闭包
1.1闭包定义
闭包(Closures)是自包含的功能代码块,可以在代码中使用或者用来作为参数传值。
1.2闭包实例
import Cocoa
let studname = { print("Swift 闭包实例。") }
studname()
import Cocoa
let divide = {(val1: Int, val2: Int) -> Int in
return val1 / val2
}
let result = divide(200, 20)
print (result)
1.3闭包表达式
1.3.1sorted 方法:据您提供的用于排序的闭包函数将已知类型数组中的值进行排序。
返回一个与原数组大小相同,包含同类型元素且元素已正确排序的新数组。
import Cocoa
let names = ["AT", "AE", "D", "S", "BE"]
// 使用普通函数(或内嵌函数)提供排序功能,闭包函数类型需为(String, String) -> Bool。
func backwards(s1: String, s2: String) -> Bool {
return s1 > s2
}
var reversed = names.sorted(by: backwards)
print(reversed)
以上程序执行输出结果为:
["S", "D", "BE", "AT", "AE"]
1.3.2参数名称缩写:直接通过$0,$1,$2来顺序调用闭包的参数。
import Cocoa
let names = ["AT", "AE", "D", "S", "BE"]
var reversed = names.sorted( by: { $0 > $1 } )
print(reversed)
1.3.3运算符函数
import Cocoa
let names = ["AT", "AE", "D", "S", "BE"]
var reversed = names.sorted(by: >)
print(reversed)
1.4尾随闭包:书写在函数括号之后的闭包表达式
import Cocoa
let names = ["AT", "AE", "D", "S", "BE"]
//尾随闭包
var reversed = names.sorted() { $0 > $1 }
print(reversed)
1.5捕获值:嵌套函数可以捕获其外部函数所有的参数以及定义的常量和变量。
incrementor实际上捕获并存储了该变量的一个副本,而该副本随着incrementor一同被存储。
所以我们调用这个函数时会累加
import Cocoa
func makeIncrementor(forIncrement amount: Int) -> () -> Int {
var runningTotal = 0
func incrementor() -> Int {
runningTotal += amount
return runningTotal
}
return incrementor
}
let incrementByTen = makeIncrementor(forIncrement: 10)
// 返回的值为10
print(incrementByTen())
// 返回的值为20
print(incrementByTen())
// 返回的值为30
print(incrementByTen())
如果您将闭包赋值给了两个不同的常量/变量,两个值都会指向同一个闭包:
import Cocoa
func makeIncrementor(forIncrement amount: Int) -> () -> Int {
var runningTotal = 0
func incrementor() -> Int {
runningTotal += amount
return runningTotal
}
return incrementor
}
let incrementByTen = makeIncrementor(forIncrement: 10)
// 返回的值为10
incrementByTen()
// 返回的值为20
incrementByTen()
// 返回的值为30
incrementByTen()
// 返回的值为40
incrementByTen()
let alsoIncrementByTen = incrementByTen
// 返回的值也为50
print(alsoIncrementByTen())