我正在努力将一些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);
Run Code Online (Sandbox Code Playgroud)
我在Swift中尝试了以下内容:
var advertisementBytes: CMutablePointer<CUnsignedChar>
self.proximityUUID.getUUIDBytes(advertisementBytes)
advertisementBytes[16] = (CUnsignedChar)(self.major >> 8)
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是Swift中的getUUIDBytes似乎只是将一个CMutablePointer<CUnsignedChar>对象作为一个参数,而不是一个CUnsignedChars数组,所以我不知道如何对adsBytes进行后续的按位操作,因为它似乎需要要成为unsignedChar数组.
另外,CMutablePointer<CUnsignedChar[21]>抛出一个错误,说Swift中的CMutablePointers不支持固定长度数组.
有人可以就潜在的解决方案或解决方案提出建议吗?非常感谢.
看看与C API交互
主要是这个
C可变指针
当函数声明为接受CMutablePointer参数时,它可以接受以下任何一个:
- nil,作为空指针传递
- CMutablePointer值
- 一个输入输出表达式,其操作数是类型为Type的存储左值,它作为左值的地址传递
- in-out Type []值,作为指向数组开头的指针传递,并在调用期间延长生命周期
如果你声明了这样一个函数:
迅速
Run Code Online (Sandbox Code Playgroud)func takesAMutablePointer(x: CMutablePointer<Float>) { /*...*/ } You可以通过以下任何一种方式调用它:
迅速
Run Code Online (Sandbox Code Playgroud)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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2946 次 |
| 最近记录: |