Arrays Swift数组元素地址

Arrays Swift数组元素地址,arrays,swift,nsdata,Arrays,Swift,Nsdata,这是一个实际问题,我通过将文件拆分为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, NS

这是一个实际问题,我通过将文件拆分为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)
}
事实证明,只有一个元素被复制到数据包中。其余的999个元素被复制到了不知何处

我的问题是,1)如何实现这一点,2)如何处理swift中的数组,使&data[i]=&data+i(如第一个示例所示)但是&data[i+k]!=&数据[i]+k

编辑:我通过执行以下操作解决了(1)

问题(2)仍然存在

不要
获取字节(&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
}
产出:

get: [1] -> val(0)
mutating: ptr(0x00007fff561619d8) <- 12
set: [1] old(0) -> new(12)
get: [1] -> val(0)
set: [1] old(0) -> new(0)
mutating: ptr(0x00007fff5c0b79e0) <- 12
产出:

get: [1] -> val(0)
mutating: ptr(0x00007fff561619d8) <- 12
set: [1] old(0) -> new(12)
get: [1] -> val(0)
set: [1] old(0) -> new(0)
mutating: ptr(0x00007fff5c0b79e0) <- 12
这意味着:

  • ptr
    作为
    foo的第一个元素的指针
  • ptr
    设为
    ptr+1
  • 变异
    ptr的值
  • 因此,
    foo[1]
    将像您那样成功地
    12

    实际上,
    数组
    的输入输出(
    &
    )非常特殊,如中所述

    当函数被声明为采用UnsafemeutablePointer参数时,它可以接受以下任一项:

    • nil,作为空指针传递
    • 不可配置的指针值
    • 一种输入输出表达式,其操作数是类型为的存储左值,作为左值的地址传递
    • 一个in-out[Type]值,作为指向数组开头的指针传递,并在调用期间延长生存期
    只有内置的
    阵列
    具有最后一项功能


    因此,当您将
    ¬arraylvalue
    (包括
    &array[i]
    )传递给
    UnsafeMutablePointer
    参数时,长度应始终为
    1
    ,而不应
    +
    -
    它。

    非常好的解释。在我看来,斯威夫特试图“帮助”人们访问记忆的方法(这在某种程度上是不可避免的)效果不好,弊大于利。
    var foo = MyStruct()
    myFunc(&foo[1] + 1, 12)
    
    get: [1] -> val(0)
    set: [1] old(0) -> new(0)
    mutating: ptr(0x00007fff5c0b79e0) <- 12
    
    var foo = [Int](count:1000, repeatedValue:0)
    myFunc(&foo + 1, 12)