如何创建自定义高阶函数,如 .maps() 或 .filter() 在 Swift 中有效

How to create custom higher order function like .maps() or .filter() works in Swift

我正在寻找 swift 中高阶函数的内部实现,例如 map、filter、reduce。

根据苹果文档。

@inlinable public func map(_ transform: (Element) throws -> T) rethrows -> [T]

Returns an array containing the results of mapping the given closure over the sequence's elements.

例如;

var arr = [1,2,3,4,5]

print(arr.map({[=11=]*5}))

输出将是

[5,10,15,20,25];

print(arr.map({String([=12=])}))

我只是想知道这里的计算基本上是如何工作的,或者更高阶在内部是如何工作的。你能在这里帮我吗,地图在这里是如何工作的,比如如何处理这些值(乘法或转换成字符串)。

map 将闭包作为其唯一的输入参数,它将序列的单个元素转换为另一种类型。 map 遍历调用它的序列的所有元素并对它们执行闭包,因此 returns 每个原始元素的转换值。

对于您的具体示例,第一个简单地将 arr 的每个元素乘以 5,因此结果数组的每个元素将包含给定索引处的原始元素乘以 5。

第二个示例简单地将每个 Int 转换为 String

您可以查看 GitHub 上的 current implementation of 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)
  }

您可以像这样创建自定义地图。在序列下,您创建自己的高阶函数。

extension Sequence {

public func customMap2<T>(

    _ transform: (Element) -> T

    ) -> [T] {

    var result = [T]()

    for item in self {

        result.append(transform(item))

    }

    return result

   }

}