综述
map 方法是 swift 提供的一种遍历多元素的方式 (数组,字典,set 等).
本质上是 sequence 协议的一种扩展。符合函数式编程。(函数式编程思想贯穿于 swift 中 )
简单理解
map 顾名思义就是映射。你可以把它看成一个 y = f(x)
. 针对序列中的每个元素做映射操作得到一个新的序列。
let c = [1: "1", 2: "2"].map(transform: ((key: Int, value: String)) throws -> T)
深入理解
官方提供的 Sequence 协议扩展中其实已经实现了 map, reduce, filter
的功能
extension Sequence {
func map<T>(_ transform: @noescape (Self.Iterator.Element) throws -> T) rethrows -> [T]
func filter(_ isIncluded: @noescape (Self.Iterator.Element) throws -> Bool) rethrows -> [Self.Iterator.Element]
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: @noescape (partialResult: Result, Self.Iterator.Element) throws -> Result) rethrows -> Result
}
下面这段摘自喵神的 《函数式 Swift》,是一个自己实现的 map 方法。
extension Array {
func map<T>(_ transform: (Element) -> T) -> [T] {
var result: [T] = []
for x in self {
result.append(transform(x))
}
return result
}
}
这个数组拓展的 map 方法可以看出, transform 是一个闭包(可以认为就是上面提到的 y = f(x)),作用是取出数组中的单个元素进行映射转换。转换的结果是 y,也就是新数组中的元素。这里之所以使用了泛型,是为了兼容任意的输出。例如,我传入一个 [Int]
需要输出一个 [String]
或其他类型。
$0 到底是个什么东西
简单来说, $0
是一种用来替换闭包的写法。如下面这个例子:
let array2 = array.map { (number: Int) -> Int in
return number + number
}
// 或
let array2 = array.map {
return $0 + $0
}
$0
对应的就是闭包中的第一个参数。
如果一个闭包 typealias Closure = (_ firstParam: Int, _ secondParam: Int) -> ()
有两个元素,那么在实际调用时
$0
代表 firstParam
, $1
代表 secondParam
。可以认为 $0 是必要调用的一种简化方式。
map 和 flatmap
直接上文章吧。 参考文章
简单的理解:从语法上,你可以这么理解,flatMap 就是先使用 map处理数组,接着将结果数组“压平”(顾名思义),也就是从输出数组里剔除值为nil的元素。
网友评论