如何扩展数组<double>?

时间:2017-01-29 16:05:59

标签: arrays swift extension-methods

使用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)}
    }
}

2 个答案:

答案 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 IntIndex == Int可让您使用Int访问数组。