Hri*_*sto 6 arrays foundation swift
是否有可能覆盖 Swift的默认数组下标,以便它处理像Python这样的负面索引?
例如,a[-1]应该返回它的最后一个元素a,以及a[-2]它之前的元素.
这应该可以通过扩展Array类型来实现,唉,下面的代码将无法工作,因为它会无限循环:
extension Array {
subscript (index:Int) -> [Element] {
return (index < 0) ? self[self.count+index] : self[index]
}
}
Run Code Online (Sandbox Code Playgroud)
覆盖那些根本性的东西的想法有多糟糕?
ois*_*sdk 16
实际上,这是一个相对良好的实践,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
Run Code Online (Sandbox Code Playgroud)
你可以很容易地改变语义.例如,这个实现要求索引大于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)]
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2562 次 |
| 最近记录: |