UnsafeMutablePointer <UInt8>到[UInt8]没有内存复制

tid*_*all 7 pointers swift

是否可以在不复制字节[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)