Swift 中数组 Array 的实用操作

2017-12-05  本文已影响1531人  ATrucouradentor

截取数组

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]
上一篇下一篇

猜你喜欢

热点阅读