Swift - 从ConstUnsafePointer转换<()>

时间:2014-07-11 00:44:50

标签: ios swift

我正处于测试阶段3.请考虑以下Objective-C行:

const uint8_t *reportData = [data bytes];

其中dataNSData个对象。

如何在Swift中重写此行?

data.bytes的类型为ConstUnsafePointer<()>,虽然有很多关于如何在Swift中创建指针类型的文档,但是关于如何使用它的信息并不多。它们。

修改 为了添加一些上下文,我试图将Apple的HeartRateMonitor示例代码移植到Swift。此代码与BLE心率监测器交互。我正在处理的代码将蓝牙系统接收的数据转换为用于UI的int。从BT收到的数据预计是一个uint数组,元素0用于检查标志,元素1包含值。

这里的上下文中的Objective-C行相同:

const uint8_t *reportData = [data bytes];
uint16_t bpm = 0;

if ((reportData[0] & 0x01) == 0) 
{
    /* uint8 bpm */
    bpm = reportData[1];
} 

3 个答案:

答案 0 :(得分:6)

您在寻找的是如何将NSData转换为UInt8数组。这是怎么回事。

import Foundation
let path = "/etc/csh.cshrc" // something existent
let data = NSData(contentsOfFile: path)

var aofb = [UInt8](count:data.length, repeatedValue:0)
data.getBytes(&aofb, length:data.length)

for c in aofb {
    let s = UnicodeScalar(Int(c)).escape(asASCII:true)
    println("\(c):\(s)")
}

答案 1 :(得分:1)

刚刚构建以下代码(以下注释代码适用于 Beta 3 ConstUnsafePointer&lt;()&gt; 需要更改为 COpaquePointer 要使用 Beta 2 ,请参阅编辑历史记录以获取更多信息)

var dataPath = NSBundle.mainBundle().pathForResource("TestData", ofType: "") // What I have in TestData is "GREETINGS WORLD"
var originalData = NSData(contentsOfFile: dataPath)
var dataLength = originalData.length
println("original data: \(originalData)") // Output original data

// Data to bytes
var reportBytes: ConstUnsafePointer<()> = originalData.bytes
var bytesToString = NSString(bytes: reportBytes, length: dataLength, encoding: NSUTF8StringEncoding)
println("string from bytes: \(bytesToString)")

// Bytes to data
var bytesToData = NSData(bytes: reportBytes, length: dataLength)
println("data from bytes: \(bytesToData)")

控制台日志

original data: <47524545 54494e47 5320574f 524c44>
string from bytes: GREETINGS WORLD
data from bytes: <47524545 54494e47 5320574f 524c44>

也发现这可能会有所帮助

ConstUnsafePointer<T>

/// This type stores a pointer to an object of type T. It provides no
/// automated memory management, and therefore the user must take care
/// to allocate and free memory appropriately.

希望这可以解决问题。

答案 2 :(得分:1)

现在我在Swift中处理蓝牙心率监视器,我发现了将NSData字节值转换为UInt8格式的最简单方法:

let bytes = UnsafePointer<UInt8>(data.bytes)

if bytes[0] & 0x01 == 0 {
    NSLog("BPM \(bytes[1]")
}