前提
Double の連続のデータが Data の中にあるとしてそれを [ Double ] にしたいとします。
let d: Data ....
Swift5 より前
withUnsafeBytes
の $0
は UnsafePointer<ContentType>
だったので以下のような感じだったのですが、これは swift5 で deprecated になりました。
Array(
UnsafeBufferPointer(
start : d.withUnsafeBytes{ p -> UnsafePointer< Double > in p }
, count : d.count / 8
)
)
Swift5 以降
withUnsafeBytes
の $0
は UnsafeRawBufferPointer
になったので、以下のような感じがいけます。
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 ) }