加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

数组 – Swift数组元素地址

发布时间:2020-12-14 04:32:57 所属栏目:百科 来源:网络整理
导读:这是一个实际问题,我通过将文件分成1000个字节的中继来发送文件 data = NSData.dataWithContentsOfFile(path)var dataPackage : [Byte](count: 1000,repeatedValue: 0)for offset = 0; offset data.length; { // omit some range check here data.getBytes(d
这是一个实际问题,我通过将文件分成1000个字节的中继来发送文件

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) <- 12
set: [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,你不应该或 – 它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读