let rawDataFromArray = NSData(bytes: myArray, length: ???)
を使用したいのですが、配列のバイト長を取得する方法がわかりません。ここに私の配列は何ができるかのいくつかの例は以下のとおりです。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
}
絵文字がそれらを代表する多くのバイトを持っている可能性があるので、私は、配列の各要素(通って、すべての文字を通過する文字列の場合に行くかどうかわからないんだけど)それを行う適切な方法です。
配列のバイトサイズを取得する方法は?
誰も私にそれを行う適切な方法を教えてもらえますか?
SwiftのArray
をNSData
に変換するのは良い方法ではないのでしょうか?
私はまた、Converting Swift Array to NSData for persistent storageとConverting array of bytes to NSDataとCustom Array to NSDataを見ましたが、そのような任意の配列のバイトサイズを取得する方法を見つけることができませんでした。
整数または浮動小数点数の配列に使用できる例については、http://stackoverflow.com/questions/25714086/swift-use-sizeof-with-int32-arrayを参照してください。しかし、 'String'構造体(固定サイズを持つ)は実際の文字ストレージへの不透明なポインタを含んでいるので、NSDataという配列の配列を単純に扱うことはできません。 –
ありがとう@MartinR。だから、NSDataに文字列の配列を変換することは悪い考えです。不透明なポインタは何かもう少し説明できますか? – Andrej
'struct String'には、「可視」APIの一部ではないメンバーがあります(ただし、デバッガで見ることができます)。これらのうちのいくつかは、文字列に使用される実際のストレージへのポインタです。 (例えば、同じ文字列は* storage *を共有することができます) - 要点は 'struct String'は自己完結型ではないということです。それをNSDataにパックし、別の場所に転送して展開すると、無効なポインタが含まれます。もちろん、文字列の配列からNSDataを作成することはできますが、各文字列(NUL終了UTF-8文字列など)を別々に追加する必要があります。 –