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



我只是在寻找 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)
}

最新更新