在Swift中使用C样式的unsigned char数组和按位运算符

时间:2014-06-04 23:44:58

标签: objective-c swift

我正在努力将一些Objective-C代码更改为Swift,我无法弄清楚如何在这个特定的代码实例中处理unsigned char数组和按位运算。

具体来说,我正在努力将以下Objective-C代码(处理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);

我在Swift中尝试了以下内容:

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

我遇到的问题是Swift中的getUUIDBytes似乎只将CMutablePointer<CUnsignedChar>对象作为参数,而不是CUnsignedChars数组,所以我不知道如何在后面按位运算advertBytes,因为它似乎需要是unsignedChar数组才能这样做。

此外,CMutablePointer<CUnsignedChar[21]>抛出一个错误,指出Swift中CMutablePointers不支持固定长度数组。

有人可以就潜在的解决方案或解决方案提供建议吗?非常感谢。

1 个答案:

答案 0 :(得分:7)

查看Interacting with C APIs

主要是这个

  

C可变指针

     

当函数声明为采用CMutablePointer时   参数,它可以接受以下任何一种:

     
      
  • nil,作为空指针传递
  •   
  • CMutablePointer值
  •   
  • 一个输入输出表达式,其操作数是类型为Type的存储左值,   它作为左值的地址传递
  •   
  • in-out Type []值,   它作为指向数组开头的指针传递,并且   在通话期间延长了生命周期
  •   
     

如果您已声明了   功能如下:

     

SWIFT

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

可以通过以下任何一种方式调用它:

     

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)

所以你的代码变成了

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