map
map 将数组的每个元素通过某个方法进行转换。map 方法的声明如下:
extension CollectionType {
public func map<T>(@noescape transform: (Self.Generator.Element) throws -> T) rethrows -> [T]
...
闭包的参数类型是Self.Generator.Element
,也就是跟调用 map 方法的那个 CollectionType 的 Element 是一致的。如果是一个 [Int],那么这个 Element 就是 Int。
闭包的返回值类型,决定了方法的返回值类型。如果闭包的返回值是 String 类型,那么 map 方法的返回值类型就是 [String]。
比如:
let a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
let b = a.map { (i) -> String in
return String(i * i)
}
print(b)
// ["1", "4", "9", "16", "25", "36", "49", "64", "81"]
因为返回值类型可以通过类型推断,所以上面的代码可以被简化为:
let a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
let b = a.map { (i) in
return String(i * i)
}
return 也能省略:
let a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
let b = a.map { (i) in
String(i * i)
}
然后再把参数名省了:
let a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
let b = a.map {
String($0 * $0)
}
filter
filter 通过某个方法过滤数组中的元素。filter 方法的声明如下:
extension SequenceType {
public func filter(@noescape includeElement: (Self.Generator.Element) throws -> Bool) rethrows -> [Self.Generator.Element]
...
与 map 方法一样,闭包的参数类型是Self.Generator.Element
,同调用者的元素类型。
不同于 map 方法,闭包的返回值的类型与调用者的元素类型是一致的。也就是说,filter 方法的返回值类型与调用者的类型是一致的。
返回 true 的元素会被留下,而返回 false 的元素会被过滤掉。
比如:
let a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
let b = a.filter { (i) -> Bool in
return i > 5
}
print(b)
// [6, 7, 8, 9]
简略写法:
let a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
let b = a.filter {
$0 > 5
}
reduce
reduce方法把数组元素组合计算为一个值。
参数类型分析与 map 和 filter 类似,不再赘述。
比如:
let a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
let b = a.reduce("") { (s, i) -> String in
return s + String(i)
}
print(b)
简写:
let a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
let b = a.reduce("") {
$0 + String($1)
}