Swift swift开发技巧iOS Developer

Swift_高级函数map & flatMap &

2017-10-18  本文已影响1433人  Mccc_

一. map

  1. 可以对数组中的每一个元素做一次处理.
let arr = [1,2,3]
let doubleD = arr.map {   
    $0 * 2
}
$0 的意思是对数组的每一个元素都操作一次.
doubleD的结果为 : [2, 4, 6]
let mapArr = [1,2,3]
let mapEndArr = mapArr.map {
    "No" + String($0)
}
mapEndArr的结果为 ["No1", "No2", "No3"]
  1. 返回值中允许nil的存在
let opArr = ["1","2",nil,"3"]
let opMapArr = opArr.map {
    $0
}
opMapArr结果为: [Optional("1"), Optional("2"), nil, Optional("3")]

二. flatMap

  1. flatMap返回后的数组中不存在nil,同时它会把Optional解包.
let opArr = ["1","2",nil,"3"]
let opEndArr = opArr.flatMap {
    $0
}
opEndArr的结果为: ["1", "2", "3"]

2.flatMap还能把数组中存有数组的数组(二维数组、N维数组)一同打开变成一个新的数组

let flatMapArr = [[1,2,3], [6,5,4]]
let flatMapEndArr = flatMapArr.flatMap {
    $0
}
flatMapEndArr的结果为 [1, 2, 3, 6, 5, 4]
  1. flatMap也能把两个不同的数组合并成一个数组,这个合并的数组元素个数是前面两个数组元素个数的乘积
let fruits = ["Apple", "Orange", "Puple"]
let counts = [2, 3, 5]

let array = counts.flatMap { count in
    fruits.map ({ fruit in
        return fruit + "  \(count)"
    })
}
array的结果 ["Apple 2", "Orange 2", "Puple 2", "Apple 3", "Orange 3", "Puple 3", "Apple 5", "Orange 5", "Puple 5"]

三. filer:过滤,可以对数组中的元素按照某种规则进行一次过滤

筛选出字符串的长度小于10的字符串
let stringArray = ["Objective-C", "Swift", "HTML", "CSS", "JavaScript"]

let resultArr_one = stringArray.filter { (string) -> Bool in
    return string.characters.count < 10
}

let resultArr_two = stringArray.filter {
    return $0.characters.count < 10
}
resultArr_one和resultArr_two的结果 ["Swift", "HTML", "CSS"]

四. reduce

Reduce 是 map、flatMap 或 filter 的一种扩展的形式(后三个函数能干嘛,reduce 就能用另外一种方式实现)。Reduce 的基础思想是将一个序列转换为一个不同类型的数据,期间通过一个累加器(Accumulator)来持续记录递增状态。为了实现这个方法,我们会向 reduce 方法中传入一个用于处理序列中每个元素的结合(Combinator)闭包 / 函数 / 方法。

func combinator(accumulator: Int, current: Int) -> Int {
   return accumulator + current
}
[1, 2, 3].reduce(0, combine: combinator)
// 执行步骤如下 
combinator(0, 1) { return 0 + 1 } = 1
combinator(1, 2) { return 1 + 2 } = 3
combinator(3, 3) { return 3 + 3 } = 6
结果为 6

[1,2,3] 中的每个元素都将调用一次结合(Combinator)函数进行处理。同时我们使用累加器(Accumulator)变量实时记录递增状态(递增并非是指加法),这里是一个整型值。
let stringArray = ["Objective-C", "Swift", "HTML", "CSS", "JavaScript"]
let reduceStr = stringArray.reduce("", {
    print("史蒂夫 \($0) + \($1)")
    
    return $0 == "" ? $1 : $0 + "、" + $1
})
上一篇下一篇

猜你喜欢

热点阅读