美文网首页Swift
Swift: map filter reduce

Swift: map filter reduce

作者: 公爵海恩庭斯 | 来源:发表于2016-05-17 17:34 被阅读91次

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

相关文章

网友评论

    本文标题:Swift: map filter reduce

    本文链接:https://www.haomeiwen.com/subject/cbpirttx.html