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)
有谁知道怎么摆脱这个?
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)
| 归档时间: |
|
| 查看次数: |
12881 次 |
| 最近记录: |