在Swift中省略Closure的函数参数声明

时间:2014-06-15 10:48:17

标签: closures swift

在“Swift编程语言”的“函数和闭包”部分,它说“当一个闭包的类型已经知道时,例如委托的回调,你可以省略它的参数类型,它的返回类型,单个语句闭包隐式返回其唯一语句的值。“

numbers.map({ number in 3 * number })

如何知道传入的参数被称为数字?

以下代码在地图实施方式方面是否正确?

e.g。

func map(callback:(number:Int) -> Int) {

}

1 个答案:

答案 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 })