2014-06-04 4 views
8

Ich arbeite daran, einige Objective-C-Code auf Swift zu ändern, und ich kann nicht für das Leben von mir sorgen, wie man unsigned Char Arrays und bitweise Operationen in dieser spezifischen Instanz des Codes.Ich benutze C-Stil unsigned char-Array und bitweise Operatoren in Swift

Insbesondere arbeite ich den folgenden Objective-C-Code auf Umwandlung zu Swift (die mit CoreBluetooth beschäftigt):

unsigned char advertisementBytes[21] = {0}; 
[self.proximityUUID getUUIDBytes:(unsigned char *)&advertisementBytes]; 
advertisementBytes[16] = (unsigned char)(self.major >> 8); 
advertisementBytes[17] = (unsigned char)(self.major & 255); 

ich folgend in Swift versucht habe:

var advertisementBytes: CMutablePointer<CUnsignedChar> 
self.proximityUUID.getUUIDBytes(advertisementBytes) 
advertisementBytes[16] = (CUnsignedChar)(self.major >> 8) 

Die Probleme, auf die ich gestoßen bin, sind, dass getUUIDBytes in Swift anscheinend nur ein Objekt als Argument verwendet, anstatt ein Array von CnsignedChars, also habe ich keine Ahnung, wie man die späteren bitweisen Operationen auf advertisementBytes durchführt, wie es scheint muss ein unsignedCh sein ar-Array dazu.

Außerdem gibt CMutablePointer<CUnsignedChar[21]> einen Fehler aus, der besagt, dass Arrays fester Länge in CMutablePointers in Swift nicht unterstützt werden.

Könnte jemand bitte über mögliche Umgehungslösungen oder Lösungen beraten? Danke vielmals.

Antwort

7

Werfen Sie einen Blick auf Interacting with C APIs

Meist diese

C Mutable Pointers

Wenn eine Funktion als Einnahme ein CMutablePointer Argument erklärt wird, es mit einer der folgenden akzeptieren:

  • Null, die als Nullzeiger übergeben wird
  • A CMutablePointer Wert
  • Ein in-outer Ausdruck, dessen Operand ein gespeicherte L-Wert vom Typ Typ, , die als die Adresse des L-Wertes übergeben wird
  • Ein In-out-Typ [] Wertes, die als übergeben wird ein Zeiger auf den Anfang des Arrays und für die Dauer des Anrufs Lebensdauer-extended

Wenn Sie eine Funktion wie diese erklärt haben:

SWIFT

func takesAMutablePointer(x: CMutablePointer<Float>) { /*...*/ } You 

es in eine der folgenden Arten aufrufen können:

SWIFT

var x: Float = 0.0 
var p: CMutablePointer<Float> = nil 
var a: Float[] = [1.0, 2.0, 3.0] 
takesAMutablePointer(nil) 
takesAMutablePointer(p) 
takesAMutablePointer(&x) 
takesAMutablePointer(&a) 

So Sie Code wird

var advertisementBytes = CUnsignedChar[]() 
self.proximityUUID.getUUIDBytes(&advertisementBytes) 
advertisementBytes[16] = CUnsignedChar(self.major >> 8) 
+0

Könnten Sie das 'Objective-C' umfassen Versionen auch? –