Mi piacerebbe usare let rawDataFromArray = NSData(bytes: myArray, length: ???)
, ma non so come ottenere la lunghezza dei byte per il mio array. Ecco alcuni esempi di ciò che potrebbe essere il mio allineamento:Come ottenere la dimensione dei byte per la matrice arbitraria in Swift?
let arr1 = [1, 2, 3]
let arr2 = [1.0, 23556789000.0]
let arr3 = ["hello", "ok", ""]
func arrayLength(myArray: Array) -> Int {
var bytes = 0
for object in myArray {
// not sure what to do here
}
return bytes
}
Non sono sicuro se andare attraverso ogni elemento della matrice (ed in caso di stringhe che attraversano ogni personaggio, dal momento che emoji potrebbe avere più byte che li rappresentano) è il modo corretto per farlo.
Come ottenere la dimensione dei byte per l'array?
Qualcuno potrebbe dirmi il modo corretto di farlo?
O forse è solo che non è una buona pratica convertire Array
in NSData
in Swift?
Ho anche visto Converting Swift Array to NSData for persistent storage e Converting array of bytes to NSData e Custom Array to NSData, ma non sono riuscito a capire come ottenere la dimensione dei byte per tale array arbitrario.
Vedere http://stackoverflow.com/questions/25714086/swift-use-sizeof-with-int32-array per un esempio che può essere utilizzato per un array di numeri interi o float. Ma non si può semplicemente trattare un array di * stringhe * come NSData, perché la struttura 'String' (che ha una dimensione fissa) contiene dei puntatori opachi alla memorizzazione effettiva dei caratteri. –
Grazie a @MartinR. Quindi sembra una cattiva idea convertire una serie di stringhe in NSData. Puoi spiegare un po 'di più cosa sono i puntatori opachi? – Andrej
'struct String' ha membri che non fanno parte dell'API" visibile "(ma puoi vederli nel debugger). Alcuni di questi sono puntatori alla memoria effettiva utilizzata per la stringa. (Quindi, per esempio, le stringhe identiche possono * condividere * l'archiviazione.) - Il punto è che 'struct String' non è autonomo. Se lo impacchettate in NSData, lo trasferite altrove e lo decomprimete, conterrà dei puntatori non validi. - Certo che * puoi * creare NSData da una serie di stringhe, ma devi aggiungere ogni stringa (ad esempio come stringa UTF-8 con terminazione NUL) separatamente. –