¿Qué es UnsafeMutablePointer <Void>? ¿Cómo modificar la memory subyacente?

Estoy intentando trabajar con la class SKMutableTexture de SKMutableTexture , pero no sé cómo trabajar con UnsafeMutablePointer< Void > . Tengo la vaga idea de que es un puntero a una sucesión de datos de byte en la memory. ¿Pero cómo puedo actualizarlo? ¿Cómo sería esto en el código?

Editar

Aquí hay una muestra básica de código para trabajar. ¿Cómo haría esto para hacer algo tan simple como crear un cuadrado rojo en la pantalla?

  let tex = SKMutableTexture(size: CGSize(width: 10, height: 10)) tex.modifyPixelDataWithBlock { (ptr:UnsafeMutablePointer<Void>, n:UInt) -> Void in /* ??? */ } 

De los documentos para SKMutableTexture.modifyPixelDataWithBlock :

Se supone que los bytes de textura se almacenan como datos de píxel de RGBA de 32 bpp, 8bpc (integer sin signo). Los componentes de color que proporciona deberían haberse multiplicado por el valor alfa.

Entonces, mientras recibe un void* , los datos subyacentes tienen la forma de una secuencia de 4×8 bits.

Podrías manipular una estructura así:

 // struct of 4 bytes struct RGBA { var r: UInt8 var g: UInt8 var b: UInt8 var a: UInt8 } let tex = SKMutableTexture(size: CGSize(width: 10, height: 10)) tex.modifyPixelDataWithBlock { voidptr, len in // convert the void pointer into a pointer to your struct let rgbaptr = UnsafeMutablePointer<RGBA>(voidptr) // next, create a collection-like structure from that pointer // (this second part isn't necessary but can be nicer to work with) // note the length you supply to create the buffer is the number of // RGBA structs, so you need to convert the supplied length accordingly... let pixels = UnsafeMutableBufferPointer(start: rgbaptr, count: Int(len / sizeof(RGBA)) // now, you can manipulate the pixels buffer like any other mutable collection type for i in indices(pixels) { pixels[i].r = 0x00 pixels[i].g = 0xff pixels[i].b = 0x00 pixels[i].a = 0x20 } } 

UnsafeMutablePointer<Void> es el equivalente Swift de void* – un puntero a cualquier cosa. Puede acceder a la memory subyacente como su propiedad de memory . Por lo general, si sabe cuál es el tipo subyacente, primero coaccionará a un puntero a ese tipo. A continuación, puede utilizar la suscripción para alcanzar un "espacio" particular en la memory.

Por ejemplo, si los datos son realmente una secuencia de valores de UInt8, podría decir:

 let buffer = UnsafeMutablePointer<UInt8>(ptr) 

Ahora puede acceder a los valores individuales de UIInt8 como buffer[0] , buffer[1] , y así sucesivamente.