Arrays Swift数组元素地址
这是一个实际问题,我通过将文件拆分为1000字节的主干来发送文件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
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)