const uint8_t *reportData = [data bytes];
переводится в
let reportData = UnsafePointer<UInt8>(data.bytes)
. Тогда reportData
имеет тип UnsafePointer<UInt8>
, и вы можете получить к нему доступ, как в (Objective-) C:
if (reportData[0] & 0x01) == 0 { ... }
Далее
bpm = reportData[1];
почти идентичен в Swift. Вы должны явно конвертировать из UInt8
в UInt16
, потому что - в отличие от (Objective-) C - Swift не подразумевает конвертацию между типами:
bpm = UInt16(reportData[1])
Объединяя это:
func getHeartBPMData(characteristic: CBCharacteristic!) {
let data = characteristic.value
let reportData = UnsafePointer<UInt8>(data.bytes)
var bpm : UInt16
if (reportData[0] & 0x01) == 0 {
bpm = UInt16(reportData[1])
} else {
bpm = UnsafePointer<UInt16>(reportData + 1)[0]
bpm = CFSwapInt16LittleToHost(bpm)
}
// ...
}
Обратите внимание, что большинство ваших переменных можно объявить как константы с let
, а не var
. Вместо
bpm = CFSwapInt16LittleToHost(bpm)
вы можете использовать конструктор littleEndian:
, который доступен для всех целых типов:
bpm = UInt16(littleEndian: bpm)
Обновление для Swift 3/4:
func getHeartBPMData(characteristic: CBCharacteristic) {
guard let reportData = characteristic.value else {
return
}
let bpm : UInt16
if (reportData[0] & 0x01) == 0 {
bpm = UInt16(reportData[1])
} else {
bpm = UInt16(littleEndian: reportData.subdata(in: 1..<3).withUnsafeBytes { $0.pointee } )
}
// ...
}