【发布时间】:2019-03-07 21:22:48
【问题描述】:
我正在尝试为 Array Types 编写一个扩展,将索引 n 中的前 n 个索引相加。
let myArray = [1, 2, 3, 4, 5]
let mySumArray = myArray.sumNIndex()
print(mySumArray)
// returns [1,3,6,10,15]
我尝试了各种方法,但在某些时候都失败了。 例如,下面的示例会触发编译错误 “不能使用类型为 '(Int, _)' 的参数列表调用 'reduce'”:
extension Array {
mutating func indexSum() {
var tempArray = [Any]()
for index in 1...self.count - 1 {
self[index] += self[.prefix(index + 2).reduce(0, +)]
}
}
}
这另一个尝试触发另一个编译错误: "二元运算符 '+=' 不能应用于两个 'Element' 操作数"
extension Array {
mutating func indexSum() {
var tempArray = [Any]()
for index in 1...self.count - 1 {
self[index] += self[index - 1]
}
}
}
欢迎任何想法! 非常感谢您的帮助!
编辑:非常感谢@Martin 和@Carpsen,他们以两种不同的方式解决了这个问题
@Martin 使用 map 方法:
extension Array where Element: Numeric {
func cumulativeSum() -> [Element] {
var currentSum: Element = 0
return map {
currentSum += $0
return currentSum
}
}
}
@Carpsen 使用 reduce 方法:
extension Array where Element: Numeric {
func indexSum() -> [Element] {
return self.reduce(into: [Element]()) {(acc, element) in
return acc + [(acc.last ?? 0) + element]
})
}
}
【问题讨论】:
标签: arrays swift extension-methods reduce