在 Swift 中的闭包类似于结构块,并可以在任何地方调用,它就像 C 和 Objective C 语言内置的函数。 函数内部定义的常数和变量引用可被捕获并存储在闭包。函数被视为封闭的特殊情况,它有 3 种形式。
在 Swift 语言闭合表达式,如下优化,重量轻语法风格,其中包括:
- 推导参数并从上下文菜单返回值的类型
- 从单封表达的隐性返回
- 简略参数名称
- 尾部闭包语法
语法
下面是一个通用的语法定义用于闭包,它接受参数并返回数据的类型:
{(parameters) -> return type in
statements
}
</div>
下面是一个简单的例子:
let studname = { println("Welcome to Swift Closures") }
studname()
</div>
当我们使用 playground 运行上面的程序,我们得到以下结果
Welcome to Swift Closures</div>
以下闭包接受两个参数并返回一个布尔值:
{(Int, Int) -> Bool in
Statement1
Statement 2
---
Statement n
}
</div>
下面是一个简单的例子:
let divide = {(val1: Int, val2: Int) -> Int in
return val1 / val2
}
let result = divide(200, 20)
println (result)
</div>
当我们使用 playground 运行上面的程序,我们得到以下结果
10</div>
在闭包中的表达式
以便捷的方式命名来定义代码块可以通过嵌套函数实现的。取而代之代表整个函数声明及名称构造用来表示函数。代表函数的语法清晰,简短声明是通过封闭的表达来实现的。
升序排列程序
排序字符串是 Swift 中保留的函数 “sorted”,这是在标准库中已提供实现。该函数将所述给定的字符串进行递增顺序排序并返回具有相同的尺寸,并在旧数组中相同数据类型的一个新的数组的元素。旧的数组保持不变。
两个参数的排序在函数内部表示:
已知类型的值表示为数组
数组的内容 (Int,Int) ,并返回一个布尔值(Bool),如果数组排序不好就会返回true,否则将返回false。
普通函数带输入字符串被写入,并传递给排序函数获得字符到新的数组,如下面所示:
func ascend(s1: String, s2: String) -> Bool {
return s1 > s2
}
let stringcmp = ascend("swift", "great")
println (stringcmp)
</div>
当我们使用 playground 运行上面的程序,我们得到以下结果
true
</div>
最初的数组排序给定为 "Swift" 和 "great"。函数用来数组排序被声明为字符串数据类型,并且返回类型为布尔型。 两个字符串进行比较,并以升序排序,并存储在新的数组。如果排序执行成功,该函数将返回true;否则将返回 false。</div>闭包表达式语法用法
常量参数:
可变参数 和 inout 参数
闭包表达不支持的默认值。可变参数和参数元组也可以用来作为参数类型和返回类型。
let sum = {(no1: Int, no2: Int) -> Int in
return no1 + no2
}
let digits = sum(10, 20)
println(digits)
</div>
当我们使用 playground 运行上面的程序,我们得到以下结果
30</div>
在函数声明中提到的参数和返回类型声明,也可通过使用 'in' 关键字内联闭包表达式函数表示。 一旦声明参数及其返回类型“in”关键字,则用于表示闭包体。
单一表达式隐式返回
在这里,排序函数的第二个参数的函数类型明确指出,一个布尔值必须由闭包返回。因为闭包体内含有一个表达式(s1 > s2)返回一个布尔值, 不会出现歧义,其返回关键字可以省略。
要返回一个表达式语句在闭包中, “return” 关键字在其声明部分被省略。
let count = [5, 10, -6, 75, 20]
var descending = sorted(count, { n1, n2 in n1 > n2 })
var ascending = sorted(count, { n1, n2 in n1 < n2 })
println(descending)
println(ascending)
</div>
当我们使用 playground 运行上面的程序,我们得到以下结果
[75, 20, 10, 5, -6] [-6, 5, 10, 20, 75]</div>
该语句本身明确规定,当 string1 大于 string2 返回 true,否则为false,因此return语句省略。
已知类型的闭包
考虑两个数相加。我们知道相加后将返回整数数据类型。因此,已知类型的闭包声明
let sub = {(no1: Int, no2: Int) -> Int in
return no1 - no2
}
let digits = sub(10, 20)
println(digits)
</div>
当我们使用 playground 运行上面的程序,我们得到以下结果
-10</div>
声明简写参数名称作为闭包
Swift 自动提供简写参数名内联闭包, 可以使用由 $0,$1,$2 等等名称,指的是封闭的参数值。
var shorthand: (String, String) -> String
shorthand = { $1 }
println(shorthand("100", "200"))
</div>
在这里,$0 和 $1 参考闭包的第一和第二个字符串参数。
当我们使用 playground 运行上面的程序,我们得到以下结果
200</div>
Swift 方便用户来表示内嵌闭包为缩写参数名为:$0, $1, $2 --- $n.
闭包参数列表中被省略定义部分,当我们表示内部闭包表达式简写参数名。 根据函数类型简写参数名称将被导出。由于简写参数表达体所定义的 'in' 关键字被省略。
闭包作为操作函数
Swift 提供了一种简单的方法访问的成员,只需提供操作符函数作为闭包。 在前面