Swift4までData型が持つwithUnsafeBytes
は以下の様な書き方ができた
dataBytes.withUnsafeBytes {(ptr: UnsafePointer<UInt8>) -> Void in
ptr.advanced(by: 0)
ptr.advanced(by: 1)
ptr.advanced(by: 2)
}
しかし、Swift5でこの書き方はDeprecatedになっており、
'withUnsafeBytes' is deprecated: use `withUnsafeBytes<R>(_: (UnsafeRawBufferPointer) throws -> R) rethrows -> R` instead
というWarningが出る。
たいていのコードは自動で直してくれるけど、これは駄目。おまけにSwiftをしばらく触っていなかったためここらへんの知識が欠落していて途方にくれたので、解決方法を探る。
とりあえず調べてみると、正しい書き方だと以下のようになる
_ = dataBytes.withUnsafeBytes { ptr in
...
}
ptrはUnsafeRawBufferPointer
となっており、このままだとptrに対してptr.advanced(by: 0)
がエラーになってしまう。
そこで、UnsafeRawBufferPointerからUnsafeRawPointerを取り出し、利用する。
baseAddress
はUnsafePointerを示し、assumingMemoryBound
を利用して生のポインタと同じメモリに対する型付ポインタを得る。
storeDataHeaderBytes.withUnsafeBytes{ rawPtr in
guard let ptr = rawPtr.baseAddress?.assumingMemoryBound(to: UInt8.self) else { return }
ptr.advanced(by: 0)
ptr.advanced(by: 1)
ptr.advanced(by: 2)
}
これで今まで通りのコードで動くようになった。
もっと良い書き方があったら誰かコメントをいただけるとありがたいです。