是否有可能覆盖Swift的默认数组下标,以便它处理像Python这样的负面索引?
例如,a[-1]
应该返回a
的最后一个元素,而a[-2]
应该返回它之前的元素。
这应该可以通过扩展Array
类型来实现,唉,下面的代码将无法工作,因为它会无限循环:
extension Array {
subscript (index:Int) -> [Element] {
return (index < 0) ? self[self.count+index] : self[index]
}
}
覆盖那些根本性的东西的想法有多糟糕?
实际上,这是一个相对良好的实践,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)]
。
标记论证的优点是它很清楚,没有人会偶然使用它。
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)]
}
}