Ich möchte let rawDataFromArray = NSData(bytes: myArray, length: ???)
verwenden, weiß aber nicht, wie die Byte-Länge für mein Array zu erhalten. Hier sind einige Beispiele von dem, was könnte mein Array sein:Wie erhalten Sie Bytes Größe für beliebige Array 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
}
Ich bin nicht sicher, ob durch jedes Element des Arrays gehen (und im Fall von Strings durch jedes Zeichen gehen, da Emojis mehr Bytes haben könnte sie vertretenden) ist der richtige Weg, es zu tun.
Wie erhalten Bytes Größe für Array?
Kann mir jemand den richtigen Weg sagen, es zu tun?
Oder ist es vielleicht nur, dass es keine gute Praxis ist, Array
in Swift zu NSData
zu konvertieren?
habe gesehen Converting Swift Array to NSData for persistent storage und Converting array of bytes to NSData und Custom Array to NSData, konnte aber nicht herausfinden, wie Bytes Größe für eine solche willkürliche Anordnung zu erhalten. Ich habe auch
Siehe http://stackoverflow.com/questions/25714086/swift-use-sizeof-with-int32-array für ein Beispiel, das für ein Array von Ganzzahlen oder Gleitkommazahlen verwendet werden kann. Aber Sie können nicht einfach ein Array von * strings * als NSData behandeln, da die 'String'-Struktur (die eine feste Größe hat) opake Zeiger auf den eigentlichen Zeichenspeicher enthält. –
Danke @MartinR. Es sieht also nach einer schlechten Idee aus, ein Array von Strings in NSData zu konvertieren. Können Sie etwas mehr erklären, was undurchsichtige Zeiger sind? – Andrej
'struct String' hat Mitglieder, die nicht Teil der" sichtbaren "API sind (aber Sie können sie im Debugger sehen). Einige davon sind Zeiger auf den tatsächlichen Speicher, der für die Zeichenfolge verwendet wird. (So können zum Beispiel identische Strings * Speicher * teilen.) - Der Punkt ist, dass 'struct String' nicht in sich abgeschlossen ist. Wenn Sie das in NSData packen, übertragen Sie es woanders und entpacken Sie es, es wird ungültige Zeiger enthalten. - Natürlich * können * Sie NSData aus einem Array von Strings erstellen, müssen aber jeden String (z. B. als NUL-terminierte UTF-8-String) separat anhängen. –