2016-11-16 4 views
3

Ich wandere von Swift 2 zu Swift 3 und ich stecke an einem Punkt fest.Swift 3 unsichere Zeiger

Swift 2

let arr = UnsafePointer<UInt32>(UnsafePointer<UInt8>(buf).advanced(by: off)) 
let msk = arr[0].bigEndian & 0x7fffffff 

Ich erhalte eine Fehlermeldung auf der ersten Zeile sagen

'init' steht nicht zur Verfügung: Verwendung 'withMemoryRebound (an: Kapazität: _)' zu vorübergehend ansehen Speicher als ein anderer Layout-kompatibler Typ.

Ich versuchte withMemoryoRebound Methode zu verwenden, aber ich bin über die Parameter nicht sicher. Gemäß this docuentation wurde UnsafePointer<> durch UnsafeRawPointer ersetzt. Also änderte ich meinen Code wie unten

let arr = UnsafeRawPointer(UnsafePointer<UInt8>(buf).advanced(by: off)) 
let msk = arr[0].bigEndian & 0x7fffffff 

Aber hier in der zweiten Zeile sagt es

Typ ‚UnsafeRawPointer‘ hat keine Index Mitglieder

Wie kann ich konvertieren es erfolgreich zu Swift 3?

+1

Dies könnte das sein, was Sie suchen: [? Wie Bytes eines UnsafeMutableRawPointer raus] (http://stackoverflow.com/questions/38983277/how-to-get-bytes-out-of -an-unsaflemablyrawpointer) –

Antwort

0

Ich glaube, Sie sind für so etwas wie folgt aussehen:

let ppp = UnsafePointer<UInt8>(buf).advanced(by: off) 
let arr = unsafeBitCast(ppp, to: UnsafeMutablePointer<UInt32>.self) 
0

Dies ist, wie Sie diese Operation withMemoryRebound mit tun können: Kapazität in diesem Fall 1 ist, wie Sie nur auf das erste Element der Suche von das resultierende Array.

let arr = UnsafePointer<UInt8>(buf).advanced(by: off) 
let msk = arr.withMemoryRebound(to: UInt32.self, capacity: 1) { p in 
    return p[0].bigEndian & 0x7fffffff 
}