数组中的Swift负索引

问题描述 投票:5回答:2

是否有可能覆盖Swift的默认数组下标,以便它处理像Python这样的负面索引?

例如,a[-1]应该返回a的最后一个元素,而a[-2]应该返回它之前的元素。

这应该可以通过扩展Array类型来实现,唉,下面的代码将无法工作,因为它会无限循环:

extension Array {
   subscript (index:Int) -> [Element] {
        return (index < 0) ? self[self.count+index] : self[index]
   }
}

覆盖那些根本性的东西的想法有多糟糕?

arrays swift foundation
2个回答
13
投票

实际上,这是一个相对良好的实践,Swifty方法:标记参数。

extension CollectionType where Index : BidirectionalIndexType {
  subscript(back i: Index.Distance) -> Generator.Element {
    return self[endIndex.advancedBy(-i)]
  }
}

let ar = [1, 2, 3, 4]
ar[back: 1] // 4
ar[back: 2] // 3

你可以很容易地改变语义。例如,这个实现要求索引大于0.更改它以使0返回最后一个元素就像:self[endIndex.predecessor().advancedBy(-i)]一样简单,或者,如果你想假设索引是负数:self[endIndex.advancedBy(-i)]

标记论证的优点是它很清楚,没有人会偶然使用它。


6
投票

Swift 4版本:

extension Collection where Index: Comparable {
    subscript(back i: Int) -> Iterator.Element {
        let backBy = i + 1
        return self[self.index(self.endIndex, offsetBy: -backBy)]
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.