Swift 3.に更新した後、コードに少し問題があります。変換前にこのコードがありました。
extension NSData {
func castToCPointer<T>() -> T {
let mem = UnsafeMutablePointer<T>.alloc(sizeof(T.Type))
self.getBytes(mem, length: sizeof(T.Type))
return mem.move()
}
}
そして、私はそれをこのコードに変換し、3行目でエラーが発生します
...タイプ「UnsafeMutablePointer」の値を予期される引数タイプ「UnsafeMutablePointer」に変換できません
extension Data {
func castToCPointer<T>() -> T{
let mem = UnsafeMutablePointer<T>.allocate(capacity: MemoryLayout<T.Type>.size)
self.copyBytes(to: mem, count: MemoryLayout<T.Type>.size)
//self.copyBytes(to: mem, count: MemoryLayout<T.Type>.size)
return mem.move()
}
}
誰かがこれを取り除く方法を知っていますか?
copyBytes
は引数としてUnsafeMutableBufferPointer
を期待します:
_extension Data {
func castToCPointer<T>() -> T {
let mem = UnsafeMutablePointer<T>.allocate(capacity: 1)
_ = self.copyBytes(to: UnsafeMutableBufferPointer(start: mem, count: 1))
return mem.move()
}
}
_
(allocate()
は、バイト数ではなく、「アイテム」の数を引数として受け取ります。)
ただし、メソッドでメモリリークが発生し、割り当てられたメモリは(move()
を使用して)初期化されませんが、割り当て解除する必要があります。
_extension Data {
func castToCPointer<T>() -> T {
let mem = UnsafeMutablePointer<T>.allocate(capacity: 1)
_ = self.copyBytes(to: UnsafeMutableBufferPointer(start: mem, count: 1))
let val = mem.move()
mem.deallocate(capacity: 1)
return val
}
}
_
より簡単な解決策は次のようになります(from round trip Swift number types to/from Data ):
_extension Data {
func castToCPointer<T>() -> T {
return self.withUnsafeBytes { $0.pointee }
}
}
_
以下の構文を拡張で使用することもできます
extension Data {
func castToCPointer<T>() -> T {
var bytes = self.bytes
var val = withUnsafePointer(to: &bytes) { (temp) in
return unsafeBitCast(temp, to: T.self)
}
return val
}
}
var data:NSData/NSMutableData
var bytes = data.bytes
var val = withUnsafePointer(to: &bytes) { (temp) in
return unsafeBitCast(temp, to: T.self)
}