web-dev-qa-db-ja.com

Swift:タイプ「UnsafeMutablePointer」の値を予期される引数タイプ「UnsafeMutablePointer」に変換できません

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

誰かがこれを取り除く方法を知っていますか?

7
Luke Pistrol

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 }
    }
}
_
7
Martin R

以下の構文を拡張で使用することもできます

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)
}
0
Ankit Thakur