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

时间:2017-07-24 18:22:17

标签: objective-c swift nsdata core-bluetooth

我在使用NSDataCoreBluetooth将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
}

逻辑在这里看起来不对吗?谢谢!

2 个答案:

答案 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,容量应为1Int16个值。另一个问题是

中的整数除法
result = CGFloat(value / 10)

截断结果(已经observed by the4kman)。

不需要从数据创建[UInt8]数组 可以使用withUnsafeBytes()的{​​{1}}方法代替。

最后,如果没有,你可以返回Data(而不是&#34;不是数字&#34;) 特征值给出:

nil