Sto trovando Swift
e NSData
come un immondo matrimony di frustrazione. Trovo che mi sembra che tutte le presunte nuove scoperte della sicurezza di Swift escano dalla finestra ogni volta che mi occupo di questa cosa. La quantità di arresti anomali (con tracce inutili) non aiuta.Estrarre i dati da NSData con Swift
Così, ho imparato che posso evitare l'UnsafeMutablePointer
roba spaventosa facendo le cose come la seguente:
var bytes = [UInt8](count: 15, repeatedValue: 0)
anNSData.getBytes(&bytes, length=15)
Ho anche scoperto che posso estrarre direttamente in valori singolari:
var u32:UInt32 = 0
anNSData.getBytes(&u32, length=4)
Questo porta a due domande intermedie:
1) c'è qualcosa che posso usare che è più affidabile di costanti hardcoded lì. Se questo fosse C, userei semplicemente sizeof
. Ma penso di aver letto che forse dovrei usare strideof
invece sizeof
? E non funzionerebbe su [UInt8]
, vero?
2) I documenti (per Swift) indicano che questo parametro deve essere _ buffer: UnsafeMutablePointer<Void>
. Quindi come funziona? Sto solo diventando fortunato? Perché dovrei farlo invece del più nativo/gestito [Uint8] costrutto ?? Mi chiedevo se lo UnsafeMutablePointer
fosse un protocollo, ma è una struttura.
Incoraggiato con la lettura dei valori direttamente (piuttosto che come una matrice), ho pensato che forse avrei potuto provare un altro tipo di struttura. Ho una struttura di 6 byte che assomiglia:
struct TreeDescription : Hashable {
var id:UInt32 = 0x00000000
var channel:UInt8 = 0x00
var rssi:UInt8 = 0x00
var hashValue:Int {
return Int(self.id)
}
}
Quale funziona realmente (dopo averci pensato non ha fatto, ma alla fine facendo un pulito che ha reso alcuni crash andare via)!
var tree = TreeDescription()
anNSData.getBytes(&newTree, length: 6)
Ma questo mi porta a preoccuparmi dei dettagli dell'imballaggio della struttura? Perché funziona? Cosa dovrei preoccuparmi di fare questo?
Questo mi sembra molto C-ish per me. Pensavo che Swift avesse portato la C fuori da ObjectiveC.
io possa avere a dare un'occhiata a questo. Ma in realtà non mi aiuta a capire perché anche altre strutture (disposte in serie o meno) sembrano funzionare bene. –
@TravisGriggs Aggiornato la mia risposta, dai un'occhiata – Kametrixom
Bello. Sono quasi arrivato, penso. Ancora non è chiaro il motivo per cui un [UInt8] può essere inserito direttamente dove va un UnsafeMutablePointer? È la natura dell'operatore inout (&)? Ho notato che posso usare l'opposto della tecnica di cui sopra per costruire un 'NSData'. Per esempio. 'NSData (& myStruct, sizeof (myStruct))' e funziona correttamente. La mia osservazione ingenua è che la variabile & beforeVariable è simile a come è in C. –