2014-06-04 16 views
8

Tôi đang làm việc để thay đổi một số Mã Mục tiêu-C sang Swift, và tôi không thể hiểu được cuộc sống của tôi như thế nào để chăm sóc mảng char chưa được ký và thao tác bit trong trường hợp mã cụ thể này.Sử dụng mảng char unsigned char kiểu mẫu và các toán tử bitwise trong Swift

Cụ thể, tôi đang làm việc trên chuyển đổi mã Objective-C sau đây (trong đó giao dịch với CoreBluetooth) để 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); 

Tôi đã thử những điều sau đây Swift:

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

Các vấn đề mà tôi đang gặp phải là getUUIDBytes trong Swift dường như chỉ lấy một đối tượng CMutablePointer<CUnsignedChar>, chứ không phải là một mảng của CUnsignedChars, vì vậy tôi không biết làm thế nào để thực hiện các thao tác bitwise sau trên adsBytes, cần phải là một unsignedCh ar mảng để làm như vậy.

Ngoài ra, CMutablePointer<CUnsignedChar[21]> ném một lỗi nói rằng mảng chiều dài cố định không được hỗ trợ trong CMutablePointers trong Swift.

Có ai vui lòng tư vấn về các giải pháp hoặc giải pháp tiềm năng không? Cảm ơn nhiều.

Trả lời

7

Có một cái nhìn tại Interacting with C APIs

Chủ yếu này

C Biên Đổi Pointers

Khi một hàm được khai báo là tham gia một CMutablePointer cãi nhau, nó có thể chấp nhận bất cứ điều nào sau đây:

  • nil, được chuyển thành con trỏ rỗng
  • Một CMutablePointer giá trị
  • An-ra biểu thức mà toán hạng là một giá trị trái lưu trữ kiểu Type, định được thông qua như là địa chỉ của vế trái
  • Một Loại [] giá trị trong-out, định được thông qua như một con trỏ đến đầu của mảng, và đời-mở rộng trong suốt thời gian của cuộc gọi

Nếu bạn đã tuyên bố một hàm như thế này một:

SWIFT

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

có thể gọi nó trong bất kỳ trong các cách sau:

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) 

Vì vậy, bạn đang trở nên

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

Ông có thể bao gồm các 'Objective-C' phiên bản quá? –

Các vấn đề liên quan