Pebble Coding

プログラマーの作業メモ

swift Array withUnsafeBufferPointer

struct Array<T> : MutableCollectionType, Sliceable, _DestructorSafeContainer {
}

extension Array {
    func withUnsafeBufferPointer<R>(body: @noescape (UnsafeBufferPointer<T>) -> R) -> R

    mutating func withUnsafeMutableBufferPointer<R>(body: @noescape (inout UnsafeMutableBufferPointer<T>) -> R) -> R
}

Array要素のswiftでの内部実装がメモリ上に連続的に並んでいるとは限らない。
そのため、withUnsafeBufferPointerを呼び出した時点で、要素が連続したメモリエリアに作成されコピーされる。 そして生成されたUnsafeBufferPointerに対して、なんらかの操作を行い結果を返すクロージャを引数に渡せるということである。
これを使って高速化するケースがあるのなら使えばよいが、私なら最初からUnsafeBufferPointerで宣言するだろう。 このメソッドが頻繁に使われる場合は最初からUnsafeBufferPointerで宣言した方が、連続メモリエリアアローケーションやコピーがない分、高速だろうなという気はする。