使用Array
类型Element
扩展Double
的语法是什么?
我已经看到了这种答案:
extension Sequence where Iterator.Element == Double {
public func multiply(by factor: Double) -> [Double] {
return self.map { $0 * factor }
}
}
但它扩展了通用Sequence
,因此它既不允许通过索引进行随机访问,也不允许count
属性进行随机访问。例如,我无法实现以下内容:
public func windowingFunc(index: Int, N: Int) -> Double {
// ...
}
extension Sequence where Iterator.Element == Double {
public func applyWindowing() -> [Double] {
return (0..<self.count).map{self[$0] * windowingFunc(index: $0, N: self.count)}
}
}
答案 0 :(得分:3)
如果要映射数组元素并且还需要其索引位置,则应使用方法enumerated()
。我还会扩展BidirectionalCollection
而不是RandomAccessCollection
,正如@Hamish在评论中已经提到的那样,使用枚举,您可以省略Index == Int
约束。
protocol BidirectionalCollection : BidirectionalIndexable, Collection
描述:支持向后和向前的集合 遍历。双向集合提供任何向后遍历 有效索引,不包括集合的startIndex。双向 因此,集合可以提供额外的操作,例如最后一个 提供对最后一个元素和a的有效访问的属性 reverse()方法以相反的顺序显示元素。在 此外,双向收集更有效率 一些序列和集合方法的实现,例如 后缀(_:)。
extension BidirectionalCollection where Iterator.Element == Double, IndexDistance == Int {
public func applyWindowing() -> [Iterator.Element] {
return enumerated().map{ $0.element * windowingFunc(index: $0.offset, N: count)}
}
}
答案 1 :(得分:2)
我通过添加许多约束来实现这一点:
extension RandomAccessCollection where Iterator.Element == Double, IndexDistance == Int, Index == Int {
public func applyWindowing() -> [Double] {
return (0..<self.count).map{self[$0] * windowingFunc(index: $0, N: self.count)}
}
}
IndexDistance == Int
的类型为count
Int
。 Index == Int
可让您使用Int
访问数组。