Swift:无法将'UnsafeMutablePointer'类型的值转换为预期的参数类型'UnsafeMutablePointer'

Luk*_*ol 7 swift 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()
  }
}
Run Code Online (Sandbox Code Playgroud)

我把它转换成了这个代码,在第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()
  }
}
Run Code Online (Sandbox Code Playgroud)

有谁知道怎么摆脱这个?

Mar*_*n R 7

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()
    }
}
Run Code Online (Sandbox Code Playgroud)

(allocate()将"items"的数量作为参数,而不是字节数.)

但请注意,您的方法泄漏内存,分配的内存move()已取消初始化(with )但也必须取消分配:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

一个更简单的解决方案是(从 往返Swift数字类型到/从数据):

extension Data {
    func castToCPointer<T>() -> T {
        return self.withUnsafeBytes { $0.pointee }
    }
}
Run Code Online (Sandbox Code Playgroud)