
data = NSData.dataWithContentsOffile(path)var dataPackage : [Byte](count: 1000,repeatedValue: 0)for offset = 0; offset < data.length; { // omit some range check here data.getBytes(&dataPackage,NSRange(location: offset,length: 1000)) send(dataPackage)} 一切都很棒,直到我想在0位置的dataPackage中插入一个序列号,所以很自然地,我会将上面的内容更改为
data.getBytes(&dataPackage[1],length: 999))
事实证明,只有1个元素被复制到dataPackage.剩下的999个元素被复制到了不知道的地方
我的问题是,1)如何使这项工作,2)如何解决swift中的数组,以及& data [i] =& data i(如第1个例子所示)但& data [ik]!=& data [i] k
编辑:我做了解决(1)
data.getBytes(&dataPackage + 1,length: 999))
问题(2)仍然存在
解决方法 不要getBytes(& dataPackage [i] k,..),我认为,这可能会导致“访问冲突”考虑以下代码:
struct MyStruct { var _val = [Int](count: 1000,repeatedValue: 0); subscript(IDx:Int) -> Int { get { println("get: [\(IDx)] -> val(\(_val[IDx]))") return _val[IDx] } set(val) { println("set: [\(IDx)] old(\(_val[IDx])) -> new(\(val))") _val[IDx] = val } }}func myFunc(ptr:UnsafeMutablePointer<Int>,val:Int) { println("mutating: ptr(\(ptr)) <- \(val)") ptr.memory = val} MyStruct只是Array的一个包装器.
myFunc接收一个可变指针并改变它的值.
有了这个,当你这样做:
var foo = MyStruct()myFunc(&foo[1],12)
输出:
get: [1] -> val(0)mutating: ptr(0x00007fff561619d8) <- 12set: [1] old(0) -> new(12)
看到?
>将值复制到某个地方
>改变某处的价值
>从某处回写
不过,我不知道某个地方在哪里.
当你喜欢的时候:
var foo = MyStruct()myFunc(&foo[1] + 1,12)
输出:
get: [1] -> val(0)set: [1] old(0) -> new(0)mutating: ptr(0x00007fff5c0b79e0) <- 12
这一次,我的猜测是:
>将值复制到某个地方
>让腐败成为某个地方1
>从某处回写具有未突变值的回写
>丢弃某处
>改变腐败的价值
另一方面,当你这样做时:
var foo = [Int](count:1000,repeatedValue:0)myFunc(&foo + 1,12)
这意味着:
>让ptr作为foo第一个元素的指针
>让ptr为ptr 1
>改变ptr的值
结果,foo [1]将成功完成12.
实际上,在the document.中提到的数组的输入(&)是非常特殊的
When a function is declared as taking an UnsafeMutablePointer argument,it can accept any of the following:
nil,which is passed as a null pointer An UnsafeMutablePointer value An in-out Expression whose operand is a stored lvalue of type Type,which is passed as the address of the lvalue An in-out [Type] value,which is passed as a pointer to the start of the array,and lifetime-extended for the duration of the call
只有内置阵列具有最后一个功能.
因此,当您将& notAnArrayLvalue(包括& array [i])传递给UnsafeMutablePointer< Type>时参数,长度应该始终为1,你不应该或 – 它.
总结以上是内存溢出为你收集整理的数组 – Swift数组元素地址全部内容,希望文章能够帮你解决数组 – Swift数组元素地址所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)