无法将 NSData Objective-C 代码转换为 Swift

Trouble converting NSData Objective-C code to Swift

我在将 Objective-C 片段转换为使用 NSDataCoreBluetooth 的 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
}