一、闭包
1.闭包是自包含的函数代码块,可以在代码中被传递和使用。闭包可以捕获和存储其所在上下文中任意常量和变量的引用。被称为包裹常量和变量。 Swift 会为你管理在捕获过程中涉及到的所有内存操作。全局和嵌套函数实际上也是特殊的闭包。
2.闭包的三种形式:全局函数是一个有名字但不会捕获任何值的闭包、嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包、闭包表达式是一个利用轻量级语法所写的可以捕获其上下文中变量或常量值的匿名闭包
3.Swfit闭包表达式拥有简洁风格。使用的时候要注意进行语法优化(利用上下文推断参数和返回值类型、隐式返回单表达式闭包,即单表达式闭包可以忽略retrun关键字、参数名称缩写、尾随闭包语法)
二、闭包表达式(从无到有然后一步步的优化)
sorted(by:) 是基于你提供的排序闭包表达式的判断结果对数组中的值(类型确定)进行排序。一旦它完成排序过程,sorted(by:) 方法会返回一个与旧数组类型大小相同类型的新数组,该数组的元素有着正确的排序顺序。原数组不会被 sorted(by:) 方法修改。sorted(by:) 方法接受一个闭包,该闭包函数需要传入与数组元素类型相同的两个值,并返回一个布尔类型值来表明当排序结束后传入的第一个参数排在第二个参数前面还是后面。如果第一个参数值出现在第二个参数值前面,排序闭包函数需要返回 true,反之返回 false。如果第一个字符串(s1)大于第二个字符串(s2),backward(_:_:) 函数会返回 true,表示在新的数组中 s1 应该出现在 s2 前。
题目:对一个 String 类型的数组进行排序(排序闭包函数类型需为 (String, String) -> Bool)
1.排序方法
let name = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
func backward(_ s1: String, _ s2: String) -> Bool {
return s1 > s2
}
var reversedNames = name.sorted(by: backward)
print(reversedNames)
2.闭包表达式(闭包表达式参数 可以是 in-out 参数,但不能设定默认值,in-out意思是block内部可可以修改,可以输出,如果你命名了可变参数,也可以使用此可变参数。元组也可以作为参数和返回值。)
{ (parameters) -> return type in
statements // 声明
}
let name = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
var reversedNames = name.sorted(by: {(s1: String, s2: String) -> Bool in // 闭包的函数体部分由关键字 in 引入。该关键字表示闭包的参数和返回值类型定义已经完成,闭包函数体即将开始。
return s1 > s2
})
print(reversedNames)
// 简化
reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in return s1 > s2 } ) // 参数叫做排序闭包函数
print(reversedNames)
3.根据上下文推断类型
因为排序闭包函数是作为参数传入的,Swift可以推断其参数和返回值的类型(实际上,通过内联闭包表达式构造的闭包作为参数传递给函数或方法时,总是能够推断出闭包的参数和返回值类型。这意味着闭包作为函数或者方法的参数时,你几乎不需要利用完整格式构造内联闭包。
)
let name = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
var reverseNames = name.sorted(by: { (s1, s2) -> Bool in return s1 > s2 } )
var reverseNames = name.sorted(by: { s1, s2 in return s1 > s2 } )
print(reverseNames)
4.单表达式闭包隐式返回:单行表达式闭包可以通过省略 return 关键字来隐式返回单行表达式的结果(sorted(by:) 方法的参数类型明确了闭包必须返回一个 Bool 类型值。因为闭包函数体只包含了一个单一表达式(s1 > s2),该表达式返回 Bool 类型值,因此这里没有歧义,return 关键字可以省略。)
let name = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
var reverseNames = name.sorted(by: { s1, s2 in s1 > s2 } )
print(reverseNames)
5.参数名称缩写:
网友评论