Swift 如何向NSMutableData.appendBytes传递不同于零的数组索引位置

Swift 如何向NSMutableData.appendBytes传递不同于零的数组索引位置,swift,nsmutabledata,Swift,Nsmutabledata,我有一个包含ASCII码的[UInt8]数组,我想从中创建一个从NSMutableData传递过来的字符串 我使用方法appendBytes并将swift数组地址传递给它,一切正常 问题是当我需要传递一个不同于零的索引时,表达式&arr[5]显然是错误的 下面的示例显示如何创建从零开始并包含5个字符的字符串(“hello”) 我必须如何修改代码以从位置6开始并获得字符串“world” 您可以创建子阵列并向其传递引用: var subA = Array(arr[6...10]) data.appe

我有一个包含ASCII码的
[UInt8]
数组,我想从中创建一个从
NSMutableData传递过来的字符串

我使用方法
appendBytes
并将swift数组地址传递给它,一切正常

问题是当我需要传递一个不同于零的索引时,表达式
&arr[5]
显然是错误的

下面的示例显示如何创建从零开始并包含5个字符的字符串(“hello”)

我必须如何修改代码以从位置6开始并获得字符串“world”


您可以创建子阵列并向其传递引用:

var subA = Array(arr[6...10])
data.appendBytes(&subA, length:subA.count)

您可以将字节数组包装到
NSData
中,并使用
subdataWithRange(…)
访问所需的字节,以下是代码:

let readOnlyData = NSData(bytesNoCopy: &arr, length: arr.count) // notice bytesNoCopy, working with the same bytes
let subRangeData = readOnlyData.subdataWithRange(NSMakeRange(6, 5))
let str = NSString(data: subRangeData, encoding: NSASCIIStringEncoding)

所以寻址一个简单的指针变成了一个非常低效的代码,我真正的代码在一个循环中,所以创建十几个子数组是多余的。数组被懒洋洋地复制——我没有检查过,但是从另一个
切片
构建一个
数组应该得到相同的字节。(您可能可以通过编写一个ObjC测试用例并传递它各种Swift子数组,然后查看您的ObjC代码接收到的指针来测试这一点。)@rickster
Slice
不是
数组,我的意思是
appendBytes(…)
不接受切片指针,这就是为什么我必须将它传递到
数组(…)
构造函数。变量前面有
var
时,由于项目的复制,它肯定会占用额外的内存。我已经发布了另一个使用
NSData
解决问题的答案,希望能有所帮助。这非常有帮助,也许我可以直接使用
NSData
并删除
arr
,只是为了模拟要分配的对象。在许多分配中转换一个简单的指针操作确实令人沮丧……NSData是一个包装器,设计用于高效处理数组(代码方面)。我建议你去。此外,NSData与NSString和其他类非常好地集成。
let readOnlyData = NSData(bytesNoCopy: &arr, length: arr.count) // notice bytesNoCopy, working with the same bytes
let subRangeData = readOnlyData.subdataWithRange(NSMakeRange(6, 5))
let str = NSString(data: subRangeData, encoding: NSASCIIStringEncoding)