Ios Swift-从常量转换为指针<;()>;

Ios Swift-从常量转换为指针<;()>;,ios,swift,Ios,Swift,我在beta 3上。考虑下面的ObjultC线: const uint8_t *reportData = [data bytes]; 其中,data是一个NSData对象 这一行如何用Swift重新书写? data.bytes属于ConstUnsafePointer类型,虽然有大量关于如何在Swift中创建指针类型的文档,但关于如何使用它们的信息并不多 编辑: 为了添加一些上下文,我尝试将Apple的HeartRateMonitor示例代码移植到Swift。此代码与BLE心率监视器交互。我正在

我在beta 3上。考虑下面的ObjultC线:

const uint8_t *reportData = [data bytes];
其中,
data
是一个
NSData
对象

这一行如何用Swift重新书写?

data.bytes
属于
ConstUnsafePointer
类型,虽然有大量关于如何在Swift中创建指针类型的文档,但关于如何使用它们的信息并不多

编辑: 为了添加一些上下文,我尝试将Apple的HeartRateMonitor示例代码移植到Swift。此代码与BLE心率监视器交互。我正在编写的这段代码将蓝牙系统接收到的数据转换为int,以便在UI中使用。从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];
} 
刚刚构建了以下代码(请注意,下面的代码适用于Beta 3ConstUnsafePointer需要更改为COpaquePointer,以便使用Beta 2,请参阅编辑历史以了解更多信息)

var-dataPath=NSBundle.mainBundle().pathForResource(“TestData”,类型:)//我在TestData中拥有的是“问候世界”
var originalData=NSData(contentsOfFile:dataPath)
var dataLength=originalData.length
println(“原始数据:\(originalData)”//输出原始数据
//将数据转换为字节
var reportBytes:ConstUnsafePointer=originalData.bytes
var bytesToString=NSString(字节:reportBytes,长度:dataLength,编码:NSUTF8StringEncoding)
println(“字节中的字符串:\(bytesToString)”)
//字节到数据
var bytesToData=NSData(字节:reportBytes,长度:dataLength)
println(“来自字节的数据:\(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.
ConstUnsafePointer
///此类型存储指向T类型对象的指针。它不提供
///自动内存管理,因此用户必须小心
///适当地分配和释放内存。

希望这能有所帮助。

您正在寻找的是如何将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)")
}

通过查看Swift中的蓝牙心率监测器,我找到了将NSData字节值转换为UInt8格式的最简单方法:

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

if bytes[0] & 0x01 == 0 {
    NSLog("BPM \(bytes[1]")
}
let bytes=UnsafePointer(data.bytes)
如果字节[0]&0x01==0{
NSLog(“BPM\(字节[1]”)
}

你想用它做什么?你在Objective-C中做了什么?你试过做同样的事情吗?我的经验是,事情一直正常进行。例如,单个“字节”应该可以使用订阅访问。在原始问题中添加了一些注释,并使用contextAnd,您是否尝试直接翻译?正如我之前所说,我的经验是订阅将按照您的预期工作。如果不发布我经历的每个排列,我会说我尝试了几个版本,尝试“直接”翻译,或使用
作为
强制转换,或尝试遍历其他一些指针对象。一些尝试由于类型原因无法编译,其他尝试将执行,但会引发运行时异常。dankogai的解决方案看起来很有希望,需要在我有硬件时进行测试。只是在我的问题中添加了一些上下文-收到的NSData对象实际上代表一个UINT数组,因此尝试转换为字符串是行不通的。新示例演示了如何将NSData转换为UInt8数组。刚才为我的问题添加了一些上下文-收到的NSData对象实际上代表一个UINT数组,因此尝试转换为字符串是行不通的。
let bytes = UnsafePointer<UInt8>(data.bytes)

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