无法将 NSData Objective-C 代码转换为 Swift
Trouble converting NSData Objective-C code to Swift
我在将 Objective-C 片段转换为使用 NSData
和 CoreBluetooth
的 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 [=13=] }
value = Int16(fPointer.pointee)
result = CGFloat(value / 10) // not correct value
return result
}
这里的逻辑看起来有问题吗?谢谢!
您应该使 return 值可选,并检查 characteristic
是否在开头为 nil 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 [=10=] }
let value = Int16(fPointer.pointee)
result = CGFloat(value) / 10
return result
}
一个错误在
let fPointer = pointer.withMemoryRebound(to: Int16.self, capacity: 2) { return [=10=] }
因为反弹指针[=13=]
只在闭包内部有效,必须
不会传到外面。此外,容量应为 1
单个 Int16
值。另一个问题是
中的整数除法
result = CGFloat(value / 10)
截断结果(已经 )。
不需要从数据创建一个[UInt8]
数组,
withUnsafeBytes()
可以使用 Data
的方法。
最后你可以 return nil
(而不是 "not a number")如果没有
给定特征值:
func minTemperature() -> CGFloat? {
guard let value = characteristic?.value else {
return nil
}
let i16val = value.withUnsafeBytes { (ptr: UnsafePointer<Int16>) in
ptr.pointee
}
return CGFloat(i16val) / 10.0
}
我在将 Objective-C 片段转换为使用 NSData
和 CoreBluetooth
的 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 [=13=] }
value = Int16(fPointer.pointee)
result = CGFloat(value / 10) // not correct value
return result
}
这里的逻辑看起来有问题吗?谢谢!
您应该使 return 值可选,并检查 characteristic
是否在开头为 nil 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 [=10=] }
let value = Int16(fPointer.pointee)
result = CGFloat(value) / 10
return result
}
一个错误在
let fPointer = pointer.withMemoryRebound(to: Int16.self, capacity: 2) { return [=10=] }
因为反弹指针[=13=]
只在闭包内部有效,必须
不会传到外面。此外,容量应为 1
单个 Int16
值。另一个问题是
result = CGFloat(value / 10)
截断结果(已经
不需要从数据创建一个[UInt8]
数组,
withUnsafeBytes()
可以使用 Data
的方法。
最后你可以 return nil
(而不是 "not a number")如果没有
给定特征值:
func minTemperature() -> CGFloat? {
guard let value = characteristic?.value else {
return nil
}
let i16val = value.withUnsafeBytes { (ptr: UnsafePointer<Int16>) in
ptr.pointee
}
return CGFloat(i16val) / 10.0
}