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])       // ここからの呼び出しで