2017-07-24 76 views
0

我一直在將Objective-C代碼片段轉換爲使用NSDataCoreBluetooth的Swift問題。我曾看過this question和其他一些人在Swift中處理NSData,但沒有取得任何成功。將NSData Objective-C代碼轉換爲Swift時遇到困難

的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; 
} 

我至今在斯威夫特(不工作):

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

一個錯誤劃分它在

let fPointer = pointer.withMemoryRebound(to: Int16.self, capacity: 2) { return $0 } 

因爲反彈指針$0僅僅是瓶蓋內有效,必須 不傳遞到外面。另外容量應該是1對於 單個Int16值。另一個問題是在

result = CGFloat(value/10) 

整數除法,其截斷的結果(如已經observed by the4kman)。

從數據中創建一個[UInt8]數組是不必要的,DatawithUnsafeBytes()方法可以用來代替。

最後你可以返回(而不是「不是一個數字」)nil如果沒有 特徵值給出:

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 
} 
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 
} 
+0

鑄造價值喜好,使該錯誤「無法調用初始化類型‘CGFloat的’與類型'(_)'的參數列表「 – Surz

+0

檢查我更新的答案。 – the4kman

相關問題