我正处于测试阶段3.请考虑以下Objective-C行:
const uint8_t *reportData = [data bytes];
其中data
是NSData
个对象。
如何在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];
}
答案 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]")
}