2014-06-04 6 views
8

Sto lavorando per modificare un codice Objective-C su Swift, e non riesco a capire per la vita di me come occuparmi di char array senza segno e operazioni bit a bit in questa specifica istanza di codice.Utilizzo di char array unsigned di stile C e operatori bit a bit in Swift

In particolare, sto lavorando sulla conversione il seguente codice Objective-C (che si occupa di CoreBluetooth) a Swift:

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); 

ho provato quanto segue in Swift:

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

I problemi che sto incontrando sono che getUUIDBytes in Swift sembra prendere solo un oggetto CMutablePointer<CUnsignedChar> come argomento, piuttosto che un array di CUnsignedChars, quindi non ho idea di come eseguire le operazioni bitwise successive su AdvertisementBytes, come sembra deve essere un CH senza segno ar array per farlo.

Inoltre, CMutablePointer<CUnsignedChar[21]> genera un errore che indica che gli array di lunghezza fissa non sono supportati in CMutablePointers in Swift.

Qualcuno può consigliare suggerimenti su possibili soluzioni o soluzioni? Grazie molto.

risposta

7

Dai un'occhiata alla Interacting with C APIs

Principalmente questo

C Mutevole Puntatori

Quando una funzione è dichiarata come prendere una argomento CMutablePointer, si può accettare uno dei seguenti:

  • nil, che viene passato come puntatore nullo
  • valore
  • Un CMutablePointer
  • Un'espressione in-out cui operando è un Ivalue memorizzata di tipo tipo, che viene passato come l'indirizzo del Ivalue
  • Un tipo [] valore-out, che viene passato come un puntatore all'inizio dell'array, e vita-esteso per tutta la durata della chiamata

Se è stata dichiarata una funzione come questo:

SWIFT

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

può chiamare in uno dei seguenti modi:

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) 

Così si codice diventa

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

Potrebbe includere la 'Objective-C' anche le versioni? –