在“Swift编程语言”的“函数和闭包”部分,它说“当一个闭包的类型已经知道时,例如委托的回调,你可以省略它的参数类型,它的返回类型,单个语句闭包隐式返回其唯一语句的值。“
numbers.map({ number in 3 * number })
如何知道传入的参数被称为数字?
以下代码在地图实施方式方面是否正确?
e.g。
func map(callback:(number:Int) -> Int) {
}
答案 0 :(得分:2)
闭包表达式通常具有
形式{ (param_1 : type_1, ..., param_n : type_n ) -> return_type in
statements
}
当闭包类型已知时,您可以省略参数类型,返回类型 以及参数周围的括号:
{ param_1, ..., param_n in
statements
}
所以回答你的问题:in
关键字将参数与
因此,在您的示例中,number
是(唯一)参数。
请注意,只有(实例或类)方法使用外部(命名)参数,但是(正常) 函数和闭包没有。所以如果你写
就没有区别let clo = { number in 3 * number }
let foo = clo(1) // foo = 3
或
let clo = { x in 3 * x }
let foo = clo(1) // foo = 3
和
numbers.map(clo)
将闭包应用于数组的每个元素并返回一个数组 返回值。
map
的实现看起来像这样(我从中获取并修改了代码
https://stackoverflow.com/a/24028208/1187415):
extension Array {
func myMap<U>(transform: (T) -> U) -> U[] {
var result = U[]() // start with empty result array
for item in self { // iterate over all items of the array
let tmp = transform(item); // map this element ...
result.append(tmp) // ... and append the mapped element to the result array
}
return result
}
}
myMap
是一个实例方法,它接受一个(T) -> U
类型的参数
并将其应用于数组本身的所有元素。
一个函数(没有泛型)将一个整数数组和一个闭包作为参数的简单例子将是
func myMapp(array: Int[], transform:(Int)->Int) -> Int[]
{
var result = Int[]()
for item in array {
let tmp = transform(item);
result.append(tmp)
}
return result
}
然后你可以做
let numbers = [1, 2, 3]
let mapped2 = myMapp(numbers, { (number) in 3 * number })