我在使用NSData
和CoreBluetooth
将Objective-C代码段转换为Swift时遇到了问题。我看过this question和其他几个在Swift中处理NSData
的人,但没有取得任何成功。
Objective-C片段:
- (CGFloat) minTemperature
{
CGFloat result = NAN;
int16_t value = 0;
// characteristic is a CBCharacteristic
if (characteristic) {
[[characteristic value] getBytes:&value length:sizeof (value)];
result = (CGFloat)value / 10.0f;
}
return result;
}
到目前为止我在Swift(不工作)中的所作所为:
func minTemperature() -> CGFloat {
let bytes = [UInt8](characteristic?.value)
let pointer = UnsafePointer<UInt8>(bytes)
let fPointer = pointer.withMemoryRebound(to: Int16.self, capacity: 2) { return $0 }
value = Int16(fPointer.pointee)
result = CGFloat(value / 10) // not correct value
return result
}
逻辑在这里看起来不对吗?谢谢!
答案 0 :(得分:0)
您应该将返回值设为可选,并在characteristic
开头检查guard
是否为零。您还应该将值显式转换为CGFloat
,然后将其除以10.
func minTemperature() -> CGFloat? {
guard characteristic != nil else {
return nil
}
let bytes = [UInt8](characteristic!.value)
let pointer = UnsafePointer<UInt8>(bytes)
let fPointer = pointer.withMemoryRebound(to: Int16.self, capacity: 2) { return $0 }
let value = Int16(fPointer.pointee)
result = CGFloat(value) / 10
return result
}
答案 1 :(得分:0)
一个错误在
let fPointer = pointer.withMemoryRebound(to: Int16.self, capacity: 2) { return $0 }
因为反弹指针$0
仅在闭包内有效且必须
不要传递到外面。对于a,容量应为1
单Int16
个值。另一个问题是
result = CGFloat(value / 10)
截断结果(已经observed by the4kman)。
不需要从数据创建[UInt8]
数组
可以使用withUnsafeBytes()
的{{1}}方法代替。
最后,如果没有,你可以返回Data
(而不是&#34;不是数字&#34;)
特征值给出:
nil