Swift5.1 闭包

闭包是独立的函数块,可以在代码中传递和使用。Swift中的闭包类似于C和Objective-C中的block以及其他编程语言中的lambdas(匿名函数)。
闭包可以捕获和存储上下文中定义的任何常量和变量的引用。

闭包表达式的语法:

{ (<#parameters#>) -> <#returnType#> in
    <#statements#> 
}

使用闭包表达式的好处在于,就像lambda一样 大大简化的了代码量,下面以sorted函数为例

正常情况下 我们可以对数组进行排序,sorted函数的参数, 参数名叫by,此参数可以是一个function,就是规定了如何排序的function,可以我们自己来自定义,就像下面的表达式:

//排序数组
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
//定义递减的排序函数
func backward(_ s1: String, _ s2: String) -> Bool {
    return s1 > s2//表示从大到小 递减的顺序
}
let newArray = names.sorted(by: backward)
print(newArray)//!< ["Ewa", "Daniella", "Chris", "Barry", "Alex"]

但是通过swift的闭包特性,我们可以将上述一段代码精简为:

//排序数组
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
let newArray = names.sorted(by: {(s1:String,s2:String)->Bool in
    return s1 > s2
})
print(newArray)//!< ["Ewa", "Daniella", "Chris", "Barry", "Alex"]

由于swift闭包具有 从上下文中推断类型的特性 因此我们可以做进一步的简化

因为排序闭包(函数类型)作为参数传递给方法,所以Swift可以推断出它的参数类型以及它返回的值的类型。同时sort(by:)方法是在字符串数组上调用的,因此排序闭包是(String,String) - > Bool的函数类型。因为可以推断出所有类型,所以排序的闭包表达式(String,String)和Bool类型的返回值也可以不用出现,这意味着可以省略->,返回值类型和参数名称周围的括号

因此可以这样写:

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
let newArray = names.sorted(by: {s1,s2 in return s1 > s2})

print(newArray)//!< ["Ewa", "Daniella", "Chris", "Barry", "Alex"]

进一步精简掉return

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
let newArray = names.sorted(by: {s1,s2 in s1 > s2})

进一步精简掉参数名称
简写参数名称,可通过名称$ 0,$ 1,$ 2等引用闭包参数的值。如果在闭包表达式中使用这些简写参数名称,则可以从闭包表达式中省略闭包的参数列表,并将通过函数类型推断简写的参数名称的数量和类型。in关键字也可以省略。

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
let newArray = names.sorted(by: {$0 > $1})

进一步精简

let newArray = names.sorted(by: >)

Swift的String类型将其大于运算符>的实现,定义为具有两个String类型参数的方法,并返回Bool类型的值。这与sorted(by :)方法所需的方法类型完全匹配。因此,可以简单地传入运算符>。
此外 还有尾随闭包 逃逸闭包 自动闭包等等。

refer:
https://juejin.im/post/5ddbd253f265da7e23276a75

由于闭包的概念相当的重要,现在再自己研究一下:

posted @ 2020-06-30 09:19  EvanMeetTheWorld  阅读(19)  评论(0)    收藏  举报