截取数组
Swift 的 Array 没有了 subarrayWithRange
这个方法,但是 Swift 提供了一个更加方便的方法:直接在数组后的中括号中添加要截取的范围即可截取数组。就是这么简单,可以说非常的“语法糖”了。
var array0 = [0, 1, 2, 3, 4, 5]
let subArray = array0[0...1]
print("subArray = ", subArray)
// subArray = [0, 1]
reduce
等同于 Rx 中的 reduce
,效果是将数组的每一个元素与之前的“结果”进行处理得到一个新的“结果”,新的“结果”再与下一个元素进行处理得到下一个新的“结果”...直到最后一个元素,输出一个最终的“结果”。
方法源码:第一个参数是初始值,第二个参数是一个闭包,闭包的参数是闭包返回的上一个结果和数组的下一个元素。
public func reduce<Result>(_ initialResult: Result,
_ nextPartialResult: (Result, Element) throws -> Result)
rethrows -> Result
例子:
let numbers = [1, 2, 3, 4, 5]
let addTwo: (Int, Int) -> Int = { x, y in x + y }
let numberSum = numbers.reduce(0, addTwo)
// numberSum == 15
map
将每一个数组元素进行转换后得到新的元素组成数组。这个很简单,也很实用,代码略过。
flatMap
flatMap 有两种重载方式,分别处理返回结果为集合和非集合的情况,但是其效果都是将一个数组转换成一个新的数组。它和 map 的区别是:1.可以过滤数组中的 nil; 2.方便将一个元素是数组的数组展开成单元素的数组。
重载一:SegmentOfResult
参数是一个根据数组元素返回对应结果的闭包,闭包中返回的是一个“数组”类型,最后的结果是将每一个该“数组” 的元素取出组成新的数组。
public func flatMap<SegmentOfResult : Sequence>
(_ transform: (Element) throws -> SegmentOfResult)
rethrows -> [SegmentOfResult.Iterator.Element]
例子:
let numbers = [1, 2, 3, 4]
let flatMapped = numbers.flatMap { Array(count: $0, repeatedValue: $0) }
// [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
let numbers = [[1, 2], [3, 4]]
let flatMapped = numbers.flatMap { $0 }
// [1, 2, 3, 4]
重载二:ElementOfResult
闭包中返回值是任意类型(泛型),如果返回值为nil,则不会在最终的结果(一个新的数组)中展示。
public func flatMap<ElementOfResult>
(_ transform: (Element) throws -> ElementOfResult?)
rethrows -> [ElementOfResult]
例子:
let numbers = ["1", "2", "three", "///4///", "5"]
let flatMapped: [Int] = numbers.flatMap { str in Int(str) }
// [1, 2, 5]