Ich finde Swift
und NSData
eine unheilige Ehe der Frustration zu sein. Ich finde, ich fühle mich wie all die vermeintlichen Neugefundenen. Schnelle Sicherheit geht jedes Mal aus dem Fenster, wenn ich mit diesem Ding klarkomme. Die Anzahl der Abstürze (mit nicht hilfreichen Spuren) hilft nicht.Daten aus NSData mit Swift erhalten
Also, ich habe gelernt, dass ich Dinge zu tun, wie die nach den beängstigend UnsafeMutablePointer
Sachen vermeiden:
var bytes = [UInt8](count: 15, repeatedValue: 0)
anNSData.getBytes(&bytes, length=15)
ich, dass auch entdeckt, ich direkt in einzelne Werte extrahieren kann:
var u32:UInt32 = 0
anNSData.getBytes(&u32, length=4)
Dies führt zu zwei Zwischen Fragen:
1) gibt es etwas, kann ich, dass zuverlässiger ist es als hartkodierte Konstanten. Wenn dies C wäre, würde ich einfach sizeof
verwenden. Aber ich denke, dass ich gelesen habe, dass ich vielleicht statt sizeof
verwenden sollte? Und das würde nicht auf [UInt8]
funktionieren, oder?
2) Die Dokumentation (für Swift) besagt, dass dieser Parameter _ buffer: UnsafeMutablePointer<Void>
sein soll. Wie funktioniert das? Bekomme ich nur Glück? Warum sollte ich das anstelle des nativer/verwalteten [Uint8] Konstrukts tun? Ich fragte mich, ob UnsafeMutablePointer
ein Protokoll war, aber es ist eine Struktur.
Ermutigt mit dem Lesen der Werte direkt (anstatt als ein Array), dachte ich, vielleicht könnte ich eine andere Art von Struktur versuchen. Ich habe eine 6-Byte-Struktur, die wie folgt aussieht:
struct TreeDescription : Hashable {
var id:UInt32 = 0x00000000
var channel:UInt8 = 0x00
var rssi:UInt8 = 0x00
var hashValue:Int {
return Int(self.id)
}
}
Welche tatsächlich funktioniert (nach dem Denken sie nicht, aber schließlich ein sauberes tun, die einige Abstürze gehen weg gemacht)!
var tree = TreeDescription()
anNSData.getBytes(&newTree, length: 6)
Aber das führt mich zu Sorgen über Struktur Pack Details? Warum funktioniert das? Worüber sollte ich mir Sorgen machen?
Das alles fühlt sich sehr C-ish für mich an. Ich dachte Swift nahm das C aus ObjectiveC heraus.
Ich muss einen Blick auf das in Anspruch nehmen. Aber es hilft mir nicht wirklich zu verstehen, warum andere Strukturen (geordnet oder nicht) auch gut zu funktionieren scheinen. –
@TravisGriggs Aktualisiert meine Antwort, überprüfen Sie es – Kametrixom
Nizza. Ich bin fast da, denke ich. Noch ist unklar, warum ein [UInt8] direkt dort eingefügt werden kann, wo ein UnsafeMutablePointer geht? Ist es die Art des Inout-Operators (&)? Ich habe bemerkt, dass ich das Gegenteil der obigen Technik verwenden kann, um ein 'NSData' zu konstruieren. Z.B. 'NSData (& myStruct, sizeof (myStruct))' und es funktioniert gut. Meine naive Beobachtung ist, dass die & vorVariable ähnlich ist wie in C. –