And*_*rej 6 arrays cocoa cocoa-touch ios swift
我想使用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
}
Run Code Online (Sandbox Code Playgroud)
我不确定是否遍历数组的每个元素(如果字符串遍历每个字符,因为表情符号可能有更多的字节代表它们)是正确的方法.
如何获取数组的字节大小?
谁能告诉我正确的方法呢?
或者也许只是在Swift中转换Array为不好的做法NSData?
我还看到将Swift数组转换为NSData用于持久存储并将字节数组转换为NSData和自定义数组转换为NSData,但无法弄清楚如何为这种任意数组获取字节大小.
似乎存在误解:对于每种类型T,所有T具有相同大小的实例都可以计算为sizeof(T).在阵列的情况下,可以有一个填充阵列元件之间的,因此需要的总大小arr1是
arr1.count * strideof(Int)
Run Code Online (Sandbox Code Playgroud)
(比较例如Swift:如何使用sizeof?来表示sizeof()和之间的细微差别strideof()).
因此,NSData从数组创建的通用函数将是
extension Array {
func asData() -> NSData {
return self.withUnsafeBufferPointer({
NSData(bytes: $0.baseAddress, length: count * strideof(Element))
})
}
}
Run Code Online (Sandbox Code Playgroud)
使用withUnsafeBufferPointer()保证阵列为其元素使用连续存储.
在"简单"类型等的情况Int和Float这给了预期的效果:
let arr1 = [1, 2, 3]
print(arr1.asData())
// <01000000 00000000 02000000 00000000 03000000 00000000>
let arr2 = [1.0, 23556789000.0]
print(arr2.asData())
// <00000000 0000f03f 0000204c 60f01542>
Run Code Online (Sandbox Code Playgroud)
但是,对于一个字符串数组它是无用的:
let arr3 = ["hello", "ok", ""]
print(arr3.asData())
// <945b2900 01000000 05000000 00000000 00000000 00000000 9a5b2900 01000000 02000000 00000000 00000000 00000000 068d2900 01000000 02000000 00000080 00000000 00000000>
Run Code Online (Sandbox Code Playgroud)
因为struct String包含(隐藏/未记录)指向实际字符存储的指针.
一种可能性是将每个字符串附加为NUL终止的UTF-8字符串:
let data3 = NSMutableData()
arr3.forEach { string in
string.withCString {
data3.appendBytes($0, length: Int(strlen($0)) + 1)
}
}
print(data3)
// <68656c6c 6f006f6b 00f09f91 8d00>
Run Code Online (Sandbox Code Playgroud)
或者,NSKeyedArchiver在您引用的线程中使用.
| 归档时间: |
|
| 查看次数: |
2107 次 |
| 最近记录: |