map
使用实例
/// let cast = ["Vivien", "Marlon", "Kim", "Karl"]
/// let lowercaseNames = cast.map { $0.lowercased() }
/// // 'lowercaseNames' == ["vivien", "marlon", "kim", "karl"]
/// let letterCounts = cast.map { $0.count }
/// // 'letterCounts' == [6, 6, 3, 4]
原理分析
@inlinable public func map<T>(_ transform: (Element) throws -> T) rethrows -> [T]
去掉各种修饰,函数输入下:
public func map<T>(_ transform: (Element) -> T) rethrows -> [T]
tranform 是一个映射闭包, 接受一个 序列的元素参数,返回一个 相同或者不用类型的元素。 map 的返回值是一个转换后的元素类型的数组。
flatMap(deprecated: 4.1, 使用 compactMap替换)
使用实例
let cast = ["Vivien", "Marlon", "Kim", "Karl"]
let lowercaseNames = cast.flatMap { $0.lowercased() }
print(lowercaseNames)// ["v", "i", "v", "i", "e", "n", "m", "a", "r", "l", "o", "n", "k", "i", "m", "k", "a", "r", "l"]
数组的元素是一个序列, flatMap进行了降维
let cast = [2, 3, 4, 5]
let lowercaseNames = cast.flatMap { $0 + 2}
print(lowercaseNames)//[4, 5, 6, 7]
数组的元素是数字,这里和使用map 的效果是一样的
源码解析
public func flatMap<SegmentOfResult>(_ transform: (Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element]
/// In fact, `s.flatMap(transform)` is equivalent to
/// `Array(s.map(transform).joined())`.
tranform 是一个闭包, 闭包对元素进行转换。
map 函数值对元素进行变换操作。 但不会对数组的结构造成影响。 而 flatMap 会影响数组的结构
compactMap
public func compactMap<ElementOfResult>(_ transform: (Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult]
用法和flatmap一致