Swift学习笔记(12)——闭包

来源:互联网 发布:飞鹰直销软件 编辑:程序博客网 时间:2024/05/16 07:00

语法

以下定义了一个接收参数并返回指定类型的闭包语法:

{(parameters) -> return type in   statements}

简单的小例子:

let divide = {(val1: Int, val2: Int) -> Int in    return val1 / val2 }let result = divide(200, 20)print (result)//以上程序执行输出结果为:10

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"]

sorted(by:)方法需要传入两个参数:
1.已知类型的数组。 || 例子中为names数组
2.闭包函数。 || func backwards(s1: String, s2: String)->Bool {return s1 > s2}
传入参数:2个,与数组元素类型相同 || 两个Sting类型
返回值:布尔类型值。 || s1>s2,大于true
True——排序结束后传入的第一个参数排在第二个参数前面
False——排在后面

参数名称缩写。可以直接通过0,1,$2来顺序调用闭包的参数。
若用参数名称缩写,可以在闭包参数列表中省略对其定义, swift会进行函数类型推断。in 关键字同样也可以被省略。
实例

let names = ["AT", "AE", "D", "S", "BE"]var reversed = names.sorted( by: { $0 > $1 } )print(reversed)// $0$1表示闭包中第一个和第二个String类型的参数。// 以上程序执行输出结果为:// ["S", "D", "BE", "AT", "AE"]

let names = ["AT", "AE", "D", "S", "BE"]var reversed = names.sorted(by: >)print(reversed)// 以上程序执行输出结果为:// ["S", "D", "BE", "AT", "AE"]

利用运算符函数,只传递一个运算符。
使用前提:sorted(by:)方法与(>)大于号运算符函数的传入参数和返回值类型相同。
Swift 的String类型定义了关于大于号 (>) 的字符串实现,其作为一个函数接受两个String类型的参数并返回Bool类型的值。 而这正好与sort(_:)方法的第二个参数需要的函数类型相符合。

四.尾随闭包

let names = ["AT", "AE", "D", "S", "BE"]//尾随闭包var reversed = names.sorted() { $0 > $1 }print(reversed)// sort() 后的 { $0 > $1} 为尾随闭包。// 以上程序执行输出结果为:// ["S", "D", "BE", "AT", "AE"]

如果函数只需要闭包表达式一个参数,使用尾随闭包时,甚至可以把()省略掉。即为:reversed = names.sorted { 0>1 }

五.捕获值

闭包的形式有:
1.全局函数:有名字但不能捕获任何值。
2.嵌套函数:有名字,也能捕获封闭函数内的值。
3.闭包表达式:无名闭包,使用轻量级语法,可以根据上下文环境捕获值。

func makeIncrementor(forIncrement amount: Int) -> () -> Int {    var runningTotal = 0    func incrementor() -> Int { // 闭包获取了runningTotal和amount的值        runningTotal += amount        return runningTotal    }    return incrementor}let incrementByTen = makeIncrementor(forIncrement: 10)// 返回的值为10print(incrementByTen())// 返回的值为20print(incrementByTen())// 返回的值为30print(incrementByTen())//以上程序执行输出结果为://10//20//30
原创粉丝点击