swift从零开始-08-闭包

2017-11-17  本文已影响8人  SPIREJ
闭包(Closusures)

闭包是自包含的函数代码块,可以在代码中被传递和使用。swift中的必败与C和OC中的代码块(block)比较相似
闭包可以捕获和存储起所在上下文中任意常量和变量的引用,这就是所谓的闭合并包裹着这些常量和比昂两,俗称闭包。


函数章节介绍的全局和嵌套函数实际上也是特殊的闭包,闭包采取如下三种形式之一:


swift闭包在常见场景中进行语法优化,主要优化如下:


闭包表达式
let names = ["Joke", "Rose", "James", "Kobe", "Paul"]

sort函数需要传入两个参数:1.一只类型的数组 2.闭包函数,闭包函数需要传入与数组类型相同的两个值,兵返回一个布尔类型值来告诉sorted函数正序还是逆序

func backwards(_ s1: String, s2: String) -> Bool {
    return s1 > s2
}

闭包表达式的语法有如下一般形式

{ (parameters) -> returnType in
    statements
}
var reversed = names.sorted(by: {(s1: String, s2: String) -> Bool in return s1 > s2})
print(reversed);
//["Rose", "Paul", "Kobe", "Joke", "James"]
根据上下文类型推断
reversed = names.sorted(by: {s1, s2 in return s1 > s2})
print(reversed)
//["Rose", "Paul", "Kobe", "Joke", "James"]
单表达式闭包隐式返回
reversed = names.sorted(by: {s1, s2 in s1 > s2})
print(reversed)
//["Rose", "Paul", "Kobe", "Joke", "James"]
参数名称缩写
reversed = names.sorted(by: {$0 > $1})
print(reversed)
//["Rose", "Paul", "Kobe", "Joke", "James"]
运算符函数
reversed = names.sorted(by: >)
print(reversed)
//["Rose", "Paul", "Kobe", "Joke", "James"]
尾随闭包

如果需要将一个很长的闭包表达式作为最后一个参数传递给函数,可以使用尾随闭包来增强函数的可读性。尾随闭包是一个书写在函数括号之后的闭包表达式,函数支持将其作为最后一个参数调用

func someFunctionThatTakesAClosure(_ closure:() -> ()) {
    //函数体部分
}

不使用尾随闭包进行函数调用

someFunctionThatTakesAClosure({
    //闭包主体部分
})

使用尾随闭包进行函数调用

someFunctionThatTakesAClosure(){
    //闭包主体部分
}

reversed = names.sorted() {
    $0 > $1
}
上一篇 下一篇

猜你喜欢

热点阅读