如何创建自定义高阶函数,如 .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
}
}
我正在寻找 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
}
}