2016-07-10 4 views
0

Viele C/Obj-C-APIs behandeln Zeiger auf void. In swift werden diese Typen normalerweise als UnsafeMutablePointer oder UnsafePointer (für const void *) dargestellt. Was ist der typische Weg in Swift, diese Werte in ein gepacktes Datenfeld umzudeuten, wie [Float] oder [UInt8]?Idiomatic Weise in Swift, um einen UnsafeMutablePointer <Void> auf ein Array von nicht void Typen zu schreiben?

+2

Sie können einen Anwendungsfall hinzuzufügen, ist die Frage zu generisch. Z.B. Warum willst du sie in ein Array konvertieren? – hnh

+0

Das spezifische Szenario ist die Verwendung von MTLBuffer.contents(), die UnsafePointer zurückgibt, da die Daten nur eine Tasche von Bits sind, was die API betrifft. Der aufrufende Code kennt die richtige Interpretation, muss aber den Typ entsprechend uminterpretieren, um natürlich darauf zugreifen zu können. – Fooberman

Antwort

0

Der einfachste Weg, es zu UInt8 Zeiger zu werfen ist:

let buffer = UnsafeMutablePointer<UInt8>(MTLBuffer.contents()) 

Und Sie können es mit Index Operatoren Zugang:

for index in 0 ..< bufferSize { 
    let foo = buffer[index]  // foo is `UInt8` type 
    ... 
    buffer[index] = bar 
} 
Verwandte Themen