1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Swift5のwithUnsafeBytesにて前の書き方がDeprecatedになっていたので修正方法を調べた

Posted at

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)
    }

これで今まで通りのコードで動くようになった。

もっと良い書き方があったら誰かコメントをいただけるとありがたいです。

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?