闭包只是一个函数,参数移动到括号内,带有关键字in
将参数与函数体分开。以下两个示例定义了等效函数:
func myFunc(number: Int) -> Int {
let result = 3 * number
return result
}
let myClosure = { (number: Int) -> Int in
let result = 3 * number
return result
}
实际上,您可以以完全相同的方式调用它们:
let x = myFunc(2) // x == 6
let y = myClosure(2) // y == 6
请注意,第二个示例与第一个示例完全相同,只是在第一个示例中,参数(number: Int) -> Int
在括号外,在第二个示例中,参数在括号内,后跟关键字in
.
map
通过获取一个数组(numbers
,在您的示例中)并创建一个新数组,该数组是将闭包函数应用于中每个元素的结果numbers
. So if numbers
is [1, 2, 3]
,上面的例子将以1
。它将应用闭包函数,这将产生一个3
(因为它所做的只是将第一个数组中的元素乘以 3)。它对中的每个元素执行此操作numbers
,直到产生一个新数组,[3, 6, 9]
.
如果你愿意的话,你可以打电话map
使用上述函数或上述闭包的名称,或者通过将其显式写在map
。以下所有示例完全等效:
let numbers = [1, 2, 3]
// Example 1
let times3 = numbers.map(myFunc) // times3 == [3, 6, 9]
// Example 2
let timesThree = numbers.map(myClosure) // timesThree == [3, 6, 9]
// Example 3
let xThree = numbers.map({ (number: Int) -> Int in
let result = 3 * number
return result // xThree == [3, 6, 9]
})
请注意,示例 3 与示例 2 相同,只是在示例 3 中,闭包在map
,而在示例 2 中,闭包已被分配给一个名为的常量myClosure
,并且常数已被提供给map
.
希望这会有所帮助 - 闭包很有趣,但令人困惑。