swift 闭包
2016-12-29 本文已影响11人
Chefil
闭包是自包含的函数代码块,可以在代码中被传递和使用。Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的匿名函数比较相似。
闭包可以捕获和存储其所在上下文中任意常量和变量的引用。被称为包裹常量和变量。 Swift 会为你管理在捕获过程中涉及到的所有内存操作。
闭包采取如下三种形式之一:
- 全局函数是一个有名字但不会捕获任何值的闭包
- 嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包
- 闭包表达式是一个利用轻量级语法所写的可以捕获其上下文中变量或常量值的匿名闭包
Swift 的闭包表达式拥有简洁的风格,并鼓励在常见场景中进行语法优化,主要优化如下:
- 利用上下文推断参数和返回值类型
- 隐式返回单表达式闭包,即单表达式闭包可以省略 return 关键字
- 参数名称缩写
- 尾随闭包语法
闭包表达式语法
{ (parameters) -> returnType in
statements
}
代码例子
let userNames = ["chefil", "lily", "hanmeimei", "jack", "tom"]
func backWords(s1: String, s2: String) -> Bool {
return s1 > s2
}
let resultName1 = userNames.sorted(by: backWords)//普通函数作为参数
print("resultName1 = \(resultName1)")
let resultName2 = userNames.sorted(by: {//闭包标准写法
(s1: String, s2: String) -> Bool in
return s1 > s2
})
print("resultName2 = \(resultName2)")
let resultName3 = userNames.sorted(by: {//根据上下文推断类型
s1, s2 in
return s1 > s2
})
print("resultName3 = \(resultName3)")
let resultName4 = userNames.sorted(by: {//单表达式闭包隐式返回
s1, s2 in s1 > s2
})
print("resultName4 = \(resultName4)")
let resultName5 = userNames.sorted(by: {//参数名称缩写
$0 > $1
})
print("resultName5 = \(resultName5)")
let resultName6 = userNames.sorted(by: (>))//运算符函数
print("resultName6 = \(resultName6)")
尾随闭包
如果你需要将一个很长的闭包表达式作为最后一个参数传递给函数,可以使用尾随闭包来增强函数的可读性。尾随闭包是一个书写在函数括号之后的闭包表达式,函数支持将其作为最后一个参数调用。在使用尾随闭包时,你不用写出它的参数标签
someFunctionThatTakesAClosure() {
// 闭包主体部分
}
- 尾随闭包写法
let resultName7 = userNames.sorted() {
$0 > $1
}
- 如果闭包表达式是函数或方法的唯一参数,则当你使用尾随闭包时,你甚至可以把 () 省略掉
let resultName8 = userNames.sorted {
$0 > $1
}
- 函数只有一个闭包参数,同时将闭包参数实现为尾随闭包
let strings = numbers.map {
(var name) -> String in
var output = ""
while number > 0 {
output = digitNames[number % 10]! + output
number /= 10
}
return number
}