是否可以在不复制字节[UInt8]
的UnsafeMutablePointer<UInt8>
情况下创建一个?
在NSData
世界上我可以简单地打电话
let data = NSData(bytesNoCopy: p, length: n, freeWhenDone: false)
Run Code Online (Sandbox Code Playgroud)
然后包装指针.
Mar*_*n R 10
正如评论中已经提到的,您可以UnsafeMutableBufferPointer
从指针创建一个
:
let a = UnsafeMutableBufferPointer(start: p, count: n)
Run Code Online (Sandbox Code Playgroud)
这并没有复制数据,这意味着你必须确保为指向的数据,只要有效a
使用.不安全(可变)缓冲区指针具有类似于数组的访问方法,例如下标:
for i in 0 ..< a.count {
print(a[i])
}
Run Code Online (Sandbox Code Playgroud)
或枚举:
for elem in a {
print(elem)
}
Run Code Online (Sandbox Code Playgroud)
您可以使用缓冲区指针创建"真实"数组
let b = Array(a)
Run Code Online (Sandbox Code Playgroud)
但这会复制数据.
以下是演示上述陈述的完整示例:
func test(_ p : UnsafeMutablePointer<UInt8>, _ n : Int) {
// Mutable buffer pointer from data:
let a = UnsafeMutableBufferPointer(start: p, count: n)
// Array from mutable buffer pointer
let b = Array(a)
// Modify the given data:
p[2] = 17
// Printing elements of a shows the modified data: 1, 2, 17, 4
for elem in a {
print(elem)
}
// Printing b shows the orignal (copied) data: 1, 2, 3, 4
print(b)
}
var bytes : [UInt8] = [ 1, 2, 3, 4 ]
test(&bytes, bytes.count)
Run Code Online (Sandbox Code Playgroud)