Swift 負の添字で配列にアクセス
Swiftの配列Arrayは負の添字で配列にアクセスできないので、拡張してみた。classにしてみたが、structにしてもいいのかもしれない。そこは判断つかない。
class SArray<T> { var a : Array<T> init(_ given: Array<T> = [T]() ){ a = given } subscript(i: Int) -> T { get { assert(abs(i) < a.count, "out of SArray index") return a[ (i >= 0 ? 0 : a.count)+i] } set { assert(abs(i) < a.count, "out of SArray index") a[ (i >= 0 ? 0 : a.count) + i ] = newValue } } } var c = SArray([0, 1, 2, 3, 4]) print(c[3]) // result -> 3 print(c[-1]) // result -> 3
extensionでできるかと思ったが、添字アクセスが再帰呼び出しになりうまくいかなかった。配列へのアクセス手段で、メソッドが定義されていれば、return self.atIndex( (i>=0 ? 0 : self.count) + i) で再帰呼び出しにはならないと思うが。ここは将来への課題であろう。
extension Array { subscript(i: Int) -> T { assert(abs(i) < self.count, "out of Array index") return self[ (i >= 0 ? 0 : self.count)+i] // ここで実行時エラー } } var d = [0,1,2,3,4] print(d[0]) // ここからの呼び出しで