我只是在寻找 swift 中高阶函数的内部实现,如 map、filter、reduce。
根据苹果文档。
@inlinable 公共函数映射(_ 转换:(元素(抛出 -> T( 重新抛出 -> [T]
返回一个数组,其中包含在序列元素上映射给定闭包的结果。
例如;
var arr = [1,2,3,4,5]
print(arr.map({$0*5}))
输出将是
[5,10,15,20,25];
或
print(arr.map({String($0)}))
我只是渴望知道计算在这里基本上是如何工作的,或者内部工作得更高。你能在这里帮我吗,地图在这里是如何工作的,比如如何处理值(乘以或转换为字符串(。
您可以像这样创建自定义地图。在序列下,您可以创建自己的高阶函数。
extension Sequence {
public func customMap2<T>(
_ transform: (Element) -> T
) -> [T] {
var result = [T]()
for item in self {
result.append(transform(item))
}
return result
}
}
map
将闭包作为其唯一的输入参数,它将序列的单个元素转换为另一种类型。map
遍历调用它的序列的所有元素,并对这些元素执行闭包,从而返回每个原始元素的转换值。
对于您的具体示例,第一个只是将arr
的每个元素乘以 5,因此结果数组的每个元素将包含给定索引乘以 5 的原始元素。
第二个示例只是将每个Int
转换为String
。
你可以在 GitHub 上查看 Sequence.map 的当前实现,因为 Swift 是一种开源语言:
@inlinable
public func map<T>(
_ transform: (Element) throws -> T
) rethrows -> [T] {
let initialCapacity = underestimatedCount
var result = ContiguousArray<T>()
result.reserveCapacity(initialCapacity)
var iterator = self.makeIterator()
// Add elements up to the initial capacity without checking for regrowth.
for _ in 0..<initialCapacity {
result.append(try transform(iterator.next()!))
}
// Add remaining elements, if any.
while let element = iterator.next() {
result.append(try transform(element))
}
return Array(result)
}