map 函数的原型如下:
func map<U>(transform: (T) -> U) -> [U]
我们可以看到该函数使用了泛型。 (T) -> U 是一个泛型闭包,它的意思就是类型 T 将会在闭包中进行逻辑处理,然后返回 U 类型。最后 map 函数会返回一个 U 类型的数组
通俗地讲:
数组的 map 方法 它的参数就是一个闭包,它会将数组里的每一个元素放在闭包中进行处理,然后返回一个新的数组,甚至是与原数组不同元素类型的新数组
示例
func greetPeople(person: String) -> String
{
return "Hello, \(person)!"
}
let guestList = ["Chris", "Jill", "Tim"]
let fullGreetings = guestList.map(greetPeople)
print(fullGreetings) // ["Hello, Chris!", "Hello, Jill!", "Hello, Tim!"]
数组的 map 方法 它的参数是一个闭包,为什么可以传入一个函数???
Swift中的函数就是闭包
闭包有三种形式:
1. 全局函数是一个有名字但不会捕获任何值的闭包。
2. 嵌套函数是一个有名字并可以捕获到其封闭函数域内的值的闭包。
3. 闭包表达式是一个利用轻量级语法所写的,可以捕获其上下文中变量或常量值的匿名闭包。
将一个全局函数 greetPeople 作为一个闭包来使用的
将 greetPeople 函数作为 guestList 数组的 map 函数的参数传入,并返回一个新的数组 fullGreetings
1.闭包表达式其实是函数的字面值,官方一般称之为匿名函数.一般当我们需要使用函数快速的实现一个简短的处理逻辑并且只使用一次的时候,我们可以省去函数名
可以直接使用闭包表达式来处理
let fullGreetings = guestList.map({(person: String) -> String
in return "Hello, \(person)!"
})
2.Swift中有类型推断的特性,所以我们可以去掉参数类型
let fullGreetings = guestList.map({(person) -> String in
return "Hello, \(person)!"
})
3.编译器可以根据 in 之前的返回值类型和 return 之后的返回数据类型自动判断,所以我们可以省略返回值和 return 关键字
let fullGreetings = guestList.map({person in
"Hello, \(person)!"
})
4.Swift中还提供了参数的简写方式: $0 代表第一个参数、 $1 代表第二个参数以此类推。所以我们又可以将参数名称省略
let fullGreetings = guestList.map ({ "Hello,\($0)"})
5.当函数的最后一个参数是闭包时,可以将闭包写在 () 之外,这也是Swift的一个特性,所以我们还可以继续简化
let fullGreetings = guestList.map(){ "Hello, \($0)!" }
6.当函数有且仅有一个参数,并且该参数是闭包时,不但可以将闭包写在 () 外,还可以省略 ()
let fullGreetings = guestList.map{ "Hello, \($0)!" }
小练习
// 例子1:对一个Int类型数组的元素进行2倍放大。如:[1,2,3]->[2,4,6]。
let arr = [1,2,3]
let doubled = arr.map{
$0 * 2
}
print(doubled)
// 输出:[2,4,6]
例子2: 将Int类型数组转换为包含对应String类型的数。如:[16,58,510] -> ["OneSix", "FiveEight", "FiveOneZero"]。
let digitNames = [
0: "Zero",1: "One", 2: "Two",3: "Three", 4: "Four",
5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"
]
let numbers = [16, 58, 510]
let strings = numbers.map { ( num ) -> String in
var output = ""
var new = num
while new > 0 {
output = digitNames[new % 10]! + output
new /= 10
}
return output
}
print(strings)
// 输出:["OneSix", "FiveEight", "FiveOneZero"]
参考文章
1.Swift中的闭包(Closure)
2.Swift Map方法