不理解 Swift 中的闭包示例

Don't understand closures example in Swift

我正在尝试了解 swift 和闭包。 我坚持这个例子。

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

什么是 (number: Int) -> Int?它是一个函数吗?它在哪里定义? https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/GuidedTour.html#//apple_ref/doc/uid/TP40014097-CH2-ID1

关键字 "in" 有什么作用?文档说使用 "to separate the arguments and return type from the body"。我不确定我是否理解这一点。为什么不使用 "in" 将 "let result = 3 * number" 与 "return result" 分开。

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

numbers.map({...})

提供给函数的闭包在被你调用的函数执行时应该接收一个参数。这个参数在你的闭包中定义:

  (number: Int) -> Int in

您现在可以在闭包

的内容中使用参数
  let result = 3 * number
  return result

闭包就是将参数移到括号内的函数,关键字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]
})

请注意,示例 3 与示例 2 相同,只是在示例 3 中,闭包在 map 内明确拼写,而在示例 2 中,闭包已分配给名为 [=28 的常量=],常量已经提供给map.

希望这对您有所帮助 - 闭包很有趣,但令人困惑。

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

语法:

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

实际场景:当用户想要应用过滤器并希望 select 值超过 300(在本例中)时,我们可以使用闭包来实现。

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]

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

关闭:

{(num: Int) -> Int? in
        return num > 300 ? num : nil
    }

(num:Int)是参数。 情报?我们要 return 可选整数类型吗?

in之后我们可以写你的逻辑。

您可以阅读更多关于闭包的内容 here