/*
Swift 中的闭包有很多优化的地方
1 根据上下文推断参数和返回值的类型
2 从单行表达式闭包中隐式返回 可以省略return
3 可以使用简化的参数如 $0 $1 意为从0或者1开始
4 提供了尾随闭包的语法
*/
//语法 parameters参数 return 隐藏了
//{(parameters) -> return type in
// parameters
//}
//最简单的闭包//省略in的
let b = {
print("这也是闭包")
}
//用变量记录函数 (带参数的闭包)
//带有参数的闭包
//参数返回值 实现代码 {形参->返回值 in 代码}
//带参数待返回值的闭包
let countNum = {(num1:Int,num2:Int)->Int in
return num1+num2;
}
let count1 = countNum(2,3)
//闭包的应用场景
/*异步执行完成回调 控制器之间的回调 自定义视图的回调*/
/* 以下代码需要在项目中的.Swift文件中完成
override func viewDidLoad() {
super.viewDidLoad()
loadData { (result) in
print("获取json信息\(result)")
}
// Do any additional setup after loading the view, typically from a nib.
}
func loadData(completion: @escaping (_ result: [String])->()) -> () {
DispatchQueue.global().async {
print("耗时操作\(Thread.current)")
Thread.sleep(forTimeInterval: 1.0);
let json=["12","23","34"]
DispatchQueue.main.async(execute: {
print("主线程\(Thread.current)")
completion(json)
})
}
}
结果为:耗时操作{number = 3, name = (null)}
主线程{number = 1, name = main}
获取json信息["12", "23", "34"]
*/
//闭包表达式
let names = ["s","b","e","h","f"]
func backwards(a1:String,a2:String)->Bool{
return a1
}
// public func sorted(by areInIncreasingOrder: (Element, Element) throws -> Bool) rethrows -> [Element]
var result = names.sorted(by:backwards)
print(result)
//参数名缩写
///以上代码还可以 Swift自动内联函数提供了参数名称缩写功能,您可以直接通过$0,$1,$2来顺序调用闭包的参数。
var result1 = names.sorted(by:{$0<$1})
print(result1)
//作为一个函数接受两个String类型的参数并返回Bool类型的值Swift可以自动推断出您想使用大于号的字符串函数实现:
//运算符函数
var result2 = names.sorted(by:<)
print(result2)
//尾随闭包
//例子1 尾随闭包是一个书写在函数括号之后的闭包表达式,函数支持将其作为最后一个参数调用。
var result3 = names.sorted(){$0<$1}
print(result3)
//例子2
//此时点回车函数会变成中括号的形式 也就是说如果函数的最后一个参数是闭包,函数的参数可以提前结束
// 最后一个参数直接使用{}来包装闭包的代码
// loadData1(completion: <#T##([String]) -> ()#>)
//以下两段代码相同只不过一个是使用尾随闭包的写法
/*func loadData(completion:@escaping (_ result:([String])->())->()){
DispatchQueue.global().async {
print("耗时操作\(Thread.current)")
Thread.sleep(forTimeInterval: 1.0);
let json=["12","23","34"]
//以下两段代码相同只不过一个是使用尾随闭包的写法
DispatchQueue.main.async{
print("主线程\(Thread.current)")
completion(json)
}
DispatchQueue.main.async(execute: {
print("主线程\(Thread.current)")
completion(json)
})
}
}
*/
网友评论