首页 » Swift » Swift学习笔记(12)——闭包

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

原文 http://blog.csdn.net/zhangergou0628/article/details/78461054

2017-11-07 02:02:09阅读(519)

语法

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

{(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,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>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)
// 返回的值为10
print(incrementByTen())
// 返回的值为20
print(incrementByTen())
// 返回的值为30
print(incrementByTen())
//以上程序执行输出结果为:
//10
//20
//30

最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示

按 Ctrl+D 键,
把本文加入收藏夹