La mia applicazione utilizza una struttura di dati inmutabili un po 'complessa che è codificata in un file binario. Ho bisogno di avere accesso ad esso a livello di byte, evitando qualsiasi copia. Normalmente, userei l'aritmetica e la tipizzazione del puntatore C o C++, per accedere e interpretare i valori dei byte grezzi. Mi piacerebbe fare lo stesso con Swift.Puntatori, aritmetica del puntatore e dati grezzi in Swift
Ho scoperto che le seguenti opere:
class RawData {
var data: NSData!
init(rawData: NSData) {
data = rawData
}
func read<T>(byteLocation: Int) -> T {
let bytes = data.subdataWithRange(NSMakeRange(byteLocation, sizeof(T))).bytes
return UnsafePointer<T>(bytes).memory
}
func example_ReadAnIntAtByteLocation5() -> Int {
return read(5) as Int
}
}
Tuttavia, io non sono sicuro di come sia efficiente. data.subdataWithRange
e NSMakeRange
allocano oggetti ogni volta che li chiamo, o sono solo zucchero sintattico per gestire i puntatori?
C'è un modo migliore per farlo in Swift?
EDIT:
Ho creato una piccola classe Objective-C che incapsula solo una funzione di compensare un puntatore da un determinato numero di byte:
@implementation RawDataOffsetPointer
inline void* offsetPointer(void* ptr, int bytes){
return (char*)ptr + bytes;
}
@end
Se includere questa classe in l'intestazione bridging, allora posso cambiare il mio metodo read
a
func read<T>(byteLocation: Int) -> T {
let ptr = offsetPointer(data.bytes, CInt(byteLocation))
return UnsafePointer<T>(ptr).memory
}
che non copiare i dati dal mio b uffer, o allocare altri oggetti.
Tuttavia, sarebbe comunque opportuno eseguire qualche calcolo aritmetico da Swift, se fosse possibile.
Il mio istinto dice che se il sottodata è immutabile, swift non si preoccuperebbe di copiarlo. –
Proprio su questo punto c'è un modo in Swift per leggere un flusso di 'UInt8's da un NSData in un modo completamente sicuro? O da un file anche? Sto usando questo dsdata NSData/subdata in un dingus di file binario che sto scrivendo ora, odio davvero guardare quelle sciocchezze "non sicure" ma sembra l'unico modo per ottenere i byte grezzi dal file. – iluvcapra