这种类型的Closure应该是什么意思,它是如何工作的?

时间:2016-06-15 17:04:05

标签: ios swift closures

来自Here

终极关闭     最后,对于超简约,有以下内容,没有浪费字节。

let testEquality9 : (Int, Int) -> Bool = (==)

4 个答案:

答案 0 :(得分:1)

这实际上不是一个闭包,它是等于运算符,用于比较存储在变量中的两个整数。

使用函数定义每个运算符,并且可以将该函数分配给变量。没有别的了。

答案 1 :(得分:1)

使用func关键字decalred的函数只是带名称的闭包。 ==是一个这样的命名函数的示例。它需要2 Int个参数,并返回Bool告诉您它们是否相等。其类型为(Int, Int) -> Bool

testEquality9是一个类型为(Int, Int) -> Bool的闭包。为此,分配了==函数的闭包。

可以像这样调用:

testEquality9(1, 2) // false
testEquality9(1, 1) // true

从中得出的关键是函数实际上只是闭包,因此可以在任何地方使用闭包。

例如,如果要对Ints数组进行排序,可以使用:

let ints = [3, 1, 4, 2]
let sorted = ints.sort{$0 < $1}

sort(_:)方法采用(Int, Int) -> Bool类型的闭包。我们的关闭{$ 0&lt; $ 1}需要2 Int个参数,并返回Bool。所以它适合那种签名。

但是,我们可以缩短此代码。由于<运算符的函数已经有(Int, Int) -> Bool类型,我们可以这样写:

let sorted = ints.sort(<)

这直接传递函数(命名为closure)<,而没有显式地使用我们自己的闭包来包装它。

答案 2 :(得分:0)

运算符重载:

func == (i : Int, j: Int) -> Bool {
     return i == j
}

应该相当于那个。

答案 3 :(得分:0)

正如其他人所说,它是缩写形式:

let testEquality9: (Int, Int) -> Bool = { (a: Int, b: Int) -> Bool in return a == b }

从右到左阅读,它会创建一个比较两个Ints并将其分配给常量testEquality9的函数。

你需要在精神上分开3件:

常数名称:

let testEquality9

常量类型(它是函数类型):

(Int, Int) -> Bool

分配给常数的值:

(==)

OR,长版本:

{ (a: Int, b: Int) -> Bool in return a == b }

享受斯威夫特:)