2016-07-02 8 views
0

Ich habe eine Frage. Ich versuche, mich mit der Mi-Band zu verbinden. Habe diesen Code auf GitHub gefunden und es funktioniert gut. Allerdings verstehe ich nicht, was mit der Datentypkonvertierung passiert.Auf Swift für Mac, Datentyp Konvertierung für BLE

  var u16 = UnsafePointer<Int32>(characteristic.value!.bytes).memory 

, die von diesem Code-Block kommt:

func peripheral(peripheral: CBPeripheral, didUpdateValueForCharacteristic characteristic: CBCharacteristic, error: NSError?) { 

    output("Data for "+characteristic.UUID.UUIDString, data: characteristic.value!) 

    if(characteristic.UUID.UUIDString == "FF06") { 
     spinnerView.hidden = true 
     let u16 = UnsafePointer<Int>(characteristic.value!.bytes).memory 
     stepsView.stringValue = ("\(u16) steps") 
    } else if(characteristic.UUID.UUIDString == "FF0C") { 
     spinnerView.hidden = true 
     var u16 = UnsafePointer<Int32>(characteristic.value!.bytes).memory 
     u16 = u16 & 0xff 
     batteryView.stringValue = ("\(u16) % charged") 
    } 


} 

Kann es mir jemand erklären? Vielen Dank!

+0

Es ist ein Weg (oder eine neue Art und Weise in der letzten Version von Swift, ich weiß nicht) NSData auf andere Werte (in unserem Fall zu konvertieren, sind sie 'int' oder' Int32 '). Vorher war es mit 'getBytes: length:'. – Larme

+0

@Larme Vielen Dank für Ihre Antwort. Warum wird in diesem Fall "UnsafePointer" verwendet? – vevek

+0

http://stackoverflow.com/questions/26045762/how-does-nsdatabyteslength-convert-byte-to-unsafefointervoid-in-swift? – Larme

Antwort

0

Dieser Teil wird die Adresse im Speicher:

characteristic.value!.bytes 

Aber der Rückgabetyp .bytes ist UnsafePointer<Void>, so ist dies dann in einen UnsafePointer<Int32> Typen umgewandelt, der die Swift entspricht einen an einen C-Zeiger ist 32-Bit-Ganzzahl (int32_t* ptr;).

UnsafePointer<Int32>(characteristic.value!.bytes) 

In Swift erhalten Sie den Inhalt eines solchen Zeiger mit .memory (in C wäre es *ptr sein). Die Variable u16 ist also ein Wert vom Typ Int32 (der Inhalt dieses Speicherplatzes wird wie in Int32 interpretiert).

var u16 = UnsafePointer<Int32>(characteristic.value!.bytes).memory 

Die nächsten Zeilen maskieren alle oberen 24 Bits aus, nur die am wenigsten signifikanten 8 Bits des Wertes zu verlassen, dann druckt dies als die Batterie Prozentsatz.

0

Swift 3

if you have this kind of characteristic : 

<CBCharacteristic: 0x26e42b42, UUID = Battery, properties = 0x33, 
    value = <4d455348 54454348 204153>, notifying = NO> 


    then use this type code: 
    let value = [UInt8](characteristic.value!)