【发布时间】:2015-11-19 10:12:20
【问题描述】:
我想使用let rawDataFromArray = NSData(bytes: myArray, length: ???),但不知道如何获取数组的字节长度。以下是我的数组的一些示例:
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,但不知道如何获取这种任意数组的字节大小。
【问题讨论】:
-
请参阅stackoverflow.com/questions/25714086/… 以获取可用于整数或浮点数数组的示例。但是您不能简单地将 strings 数组视为 NSData,因为
String结构(具有固定大小)包含指向实际字符存储的不透明指针。 -
感谢@MartinR。因此,将字符串数组转换为 NSData 看起来是个坏主意。你能解释一下什么是不透明指针吗?
-
struct String具有不属于“可见”API 的成员(但您可以在调试器中看到它们)。其中一些是指向用于字符串的实际存储的指针。 (例如,相同的字符串可以共享>存储。) – 关键是struct String不是自包含的。如果将其打包到 NSData 中,将其转移到其他地方并解包,它将包含无效指针。 – 当然,您可以从字符串数组创建 NSData,但必须单独附加每个字符串(例如,作为 NUL 终止的 UTF-8 字符串)。 -
或者,使用 NSKeyedArchiver (如在您引用的线程中)。这取决于您要如何处理数据。
标签: ios arrays swift cocoa cocoa-touch