不理解Swift中的闭包示例

时间:2015-01-13 21:23:30

标签: ios swift dictionary closures

我试图了解快速和关闭。 我坚持这个例子。

 numbers.map({
    (number: Int) -> Int in
    let result = 3 * number
    return result
 })

什么是(数字:国际) - >诠释?这是一个功能吗?它在哪里定义? https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/GuidedTour.html#//apple_ref/doc/uid/TP40014097-CH2-ID1

关键字" in"做?文档说使用"将参数和返回类型与正文分开#34;。我不确定我明白这一点。为什么没有""在"用于分离"让结果= 3 *数"来自"返回结果"。

3 个答案:

答案 0 :(得分:32)

闭包只是一个函数,参数在括号内移动,关键字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中每个元素的结果。因此,如果numbers[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] }) 。以下所有示例都完全等效:

map

请注意,示例3与示例2相同,仅在示例3中,闭包在myClosure内明确拼写,而在示例2中,闭包已分配给名为map的常量,常量已提供给{{1}}。

希望这会有所帮助 - 关闭很有趣,但令人困惑。

答案 1 :(得分:1)

您正在调用的函数将闭包作为其参数:

numbers.map({...})

提供给函数的闭包在您调用的函数执行时期望接收参数。此参数在闭包中定义:

  (number: Int) -> Int in

您现在可以使用中的参数闭包的内容

  let result = 3 * number
  return result

答案 2 :(得分:0)

闭包是一个独立的功能块,可以在代码中传递和使用。

语法:

error: forward reference extends over definition of value x
   val x: Int = y + 1
                ^

实际场景:当用户想要应用过滤器并希望选择超过300的值时(在这种情况下),我们可以使用闭包来实现此目的。

{(parameterName: ParameterType) -> returnType in
    //Statements
}

从下面的代码中你可以清楚地看到我们正在将闭包传递给elements.map()函数。

<强>关闭:

var elements: [Int] = [Int]() //Declaring Empty array
elements = [1001, 999, 555, 786, 988, 322, 433, 128, 233, 222, 201, 276, 133]

var filteredElements = elements.map({(num: Int) -> Int? in
    return num > 300 ? num : nil
})

output:
[Optional(1001), Optional(999), Optional(555), Optional(786), Optional(988), Optional(322), Optional(433), nil, nil, nil, nil, nil, nil]

{(num: Int) -> Int? in return num > 300 ? num : nil } 是参数。 诠释?我们是否会返回可选的整数类型。

(num:Int)之后,我们可以编写您的逻辑。

您可以阅读有关关闭here的更多信息。