I'm not sure what you mean by "I need the buffer to be a vector /.../" but
perhaps this may be of some help:

struct S {
    var x: Float
    var y: Float
    var z: Float
    var r: UInt8
    var g: UInt8
    var b: UInt8
    var a: UInt8
}
var buf = S(x: 0.1, y: 1.2, z: 2.3, r: 11, g: 22, b: 33, a: 44)
print(MemoryLayout<S>.stride) // 16
withUnsafeMutableBytes(of: &buf) { ptr in
    print("x:", ptr.load(fromByteOffset: 0, as: Float.self)) // 0.1
    print("y:", ptr.load(fromByteOffset: 4, as: Float.self)) // 1.2
    print("z:", ptr.load(fromByteOffset: 8, as: Float.self)) // 2.3
    print("r:", ptr.load(fromByteOffset: 12, as: UInt8.self)) // 11
    print("g:", ptr.load(fromByteOffset: 13, as: UInt8.self)) // 22
    print("b:", ptr.load(fromByteOffset: 14, as: UInt8.self)) // 33
    print("a:", ptr.load(fromByteOffset: 15, as: UInt8.self)) // 44
}

NOTE however that the memory layout of Swift-structs is not guaranteed to
remain like this and is thus not future-proof, although I think that
if/when things changes, there will be some way to tell the compiler that
you want the memory to be this "expected" "C-like" layout.

/Jens


On Wed, Jan 10, 2018 at 10:03 PM, Kelvin Ma via swift-users <
swift-users@swift.org> wrote:

> I want to create a buffer with the layout
>
> 0           4           8           12      13      14      15      16
> [   x:Float   |   y:Float   |   z:Float   | r:UInt8 | g:UInt8 | b:UInt8 |
> _:UInt8 ]
>
> Normally, I’d use UnsafeRawBufferPointer for this, but I need the buffer
> to be a vector (i.e. with append(_:)), and for it to return a
> Swift-managed Array<UInt8>. How should I do this? The project does not
> use Foundation.
>
> _______________________________________________
> swift-users mailing list
> swift-users@swift.org
> https://lists.swift.org/mailman/listinfo/swift-users
>
>
_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to