2014/06/05

Swiftのextensionとsubscriptで文字列のスライス化っぽいのを実現してみる

PythonとかGoで使えるスライス。Swiftでは使えなさそうですが、extensionsubscriptとRangeオペレータ(.....)でそれっぽいのが作れそうだったので試しにやってみました。

// Swift
let s = "foobar"
let x = s[4]       // a
let y = s[3..5]    // ba

IntからString.Intexの簡単な取りかたがわからなかったので、_indexで取れるようにしています。

extension String {
    func _index(pos:Int) -> String.Index {
        let end = self.endIndex
        var p = self.startIndex
        for var i = 0; i < pos; ++i {
            if p == end {
                break;
            }
            p = p.succ()
        }
        return p
    }

    subscript(p:Int) -> String {
        return self[p..(p+1)]
    }
    subscript(r:Range<Int>) -> String {
        let s = self._index(r.startIndex)
        let e = self._index(r.endIndex)
        let range = Range(start:s, end:e)
        return self.substringWithRange(range)
    }
}

subscriptはオーバーロードできたり2引数以上取れたりするので、行列クラスを作ったりもできそうです。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。