不理解 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。
我正在尝试了解 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。