Swift初见Swift闭包

Posted weasleyqi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift初见Swift闭包相关的知识,希望对你有一定的参考价值。

闭包是功能性自包含模块,可以在代码中被传递和使用。与objective-c中的block比较类似。


闭包有三种形式:

1、全局函数
2、嵌套函数
3、闭包表达式是一个利用轻量级语法所写的可以捕获其上下文中变量或常量值的没有名字的闭包

闭包表达式是一种利用简洁语法构建内联闭包的方式。 闭包表达式提供了一些语法优化, 使得撰写闭包变得简单明了。

闭包的一般形式:
 (parameters) -> return type in
statements


以swift提供的sort函数为例:

对一个数组进行排序:

普通函数的做法是:
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

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

var reserve = sorted(names, backwards)
println(reserve)


得到的输出为:
[Ewa, Daniella, Chris, Barry, Alex]


使用闭包表达式的代码为:
var reserved = sorted(names, (s1 : String , s2 : String) -> Bool in
    return s1 > s2
)
println(reserved)


得到的输出为:

[Ewa, Daniella, Chris, Barry, Alex]


相当于把backwards函数作为一个参数传给了sorted函数,函数和返回值类型都应该写在大括号内。闭包的函数体部分由in关键字引入,in后面就是代表该闭包的函数体部分。

swift函数有类型推断的功能,排序闭包又是作为函数的参数传入的,那么swift可以推断出它的参数和返回值类型,那么sorted函数可以改写为:
var reserved1 = sorted(names, s1 , s2 in return s1 > s2)
println(reserved1)


我们可以看出得出的结果还是一样的。

单行表达式闭包可以通过隐藏return关键字来隐式返回表达式的结果。那么上面的代码可以改写为:
var reserved2 = sorted(names, (s1 : String , s2 : String) -> Bool in  s1 > s2 )
println(reserved2)



参数名简写:
swift自动为内联函数提供了参数名简写功能,可以直接通过$0 $1 $2等名字来引用的闭包的参数的值。
用字符串排序的时候,系统对”>”符号总报有歧义这个错误,用int数据来排序就没问题了。
let intNumbers = [2, 3, 4, 5]
var reserved3 = sorted(intNumbers,  $0 > $1 )
println(reserved3)


得到的结果是:

[5, 4, 3, 2]


希望大家共同学习。

以上是关于Swift初见Swift闭包的主要内容,如果未能解决你的问题,请参考以下文章

Swift初见Swift数组

理解 Swift 中 map 函数的简写闭包语法

为啥在 Swift 的单数返回表达式中使用闭包简写变量必须详尽无遗?

Swift初见Swift数组

简写的闭包数组:Xcode Swift:表达式太复杂,无法在合理的时间内解决

Swift 中的尾随闭包语法是啥?