Edited at

Swift5 での Data.withUnsafeBytes


前提

Double の連続のデータが Data の中にあるとしてそれを [ Double ] にしたいとします。

let d: Data ....


Swift5 より前

withUnsafeBytes$0UnsafePointer<ContentType> だったので以下のような感じだったのですが、これは swift5 で deprecated になりました。

Array(

UnsafeBufferPointer(
start : d.withUnsafeBytes{ p -> UnsafePointer< Double > in p }
, count : d.count / 8
)
)


Swift5 以降

withUnsafeBytes$0UnsafeRawBufferPointer になったので、以下のような感じがいけます。

d.withUnsafeBytes{

Array(
UnsafeBufferPointer(
start : $0.baseAddress!.assumingMemoryBound( to: Double.self )
, count : $0.count / 8
)
)
}

とか

Array(

d.withUnsafeBytes{
UnsafeBufferPointer(
start : $0.baseAddress!.assumingMemoryBound( to: Double.self )
, count : $0.count / 8
)
}
)


メリット

クロージャの中でデータの count が取れるので、Data を保持するための変数(ここでは d )を定義せずに以下のように書けるようになりました。

Data( ... ).withUnsafeBytes ...


補足

ちなみに、最初のデータひとつだけが必要なのであれば、以下の書き方ができます。

d.withUnsafeBytes { $0.load( as: Double.self ) }