gpt4 book ai didi

ios - 了解 Swift 的数组实现

转载 作者:搜寻专家 更新时间:2023-10-31 22:36:19 25 4
gpt4 key购买 nike

出于好奇,我用 Swift 编写了以下代码:

func ptr(x:UnsafePointer<Void>) -> UnsafePointer<Void> {
return x
}

var ary = [Int]()
var curp = ptr(&ary)
println("ptr(init): \(curp)")
for i in 0 ... 100000 {
ary.append(i)
let p = ptr(&ary)
if(curp != p) {
println("ptr(chgd): \(p) at index \(i)")
curp = p
}
}

输出:

ptr(init): 0x00007fa233449b60
ptr(chgd): 0x00007fa23344db50 at index 0
ptr(chgd): 0x00007fa23344e4b0 at index 2
ptr(chgd): 0x00007fa23344e600 at index 4
ptr(chgd): 0x00007fa23344f0a0 at index 8
ptr(chgd): 0x00007fa23344eeb0 at index 16
ptr(chgd): 0x00007fa23344f1e0 at index 32
ptr(chgd): 0x00007fa233840420 at index 64
ptr(chgd): 0x00007fa233840a20 at index 188
ptr(chgd): 0x00007fa233841620 at index 380
ptr(chgd): 0x00007fa233842e20 at index 764
ptr(chgd): 0x00007fa23403ca20 at index 1532
ptr(chgd): 0x00007fa233845e20 at index 3068
ptr(chgd): 0x00007fa23480f820 at index 6140
ptr(chgd): 0x00000001140b7020 at index 12284
ptr(chgd): 0x000000011731b020 at index 33276
ptr(chgd): 0x000000011739d020 at index 66556

嗯,我想,Array 偶尔会替换引用变量(即 ary)?也许我可以用我的 struct by assigning to self 做到这一点?

struct MyStruct {

var i = 0

mutating func mutate(i:Int) {
var newself = MyStruct(i: i)
println("ptr(news): \(ptr(&newself)), \(newself.i)")
self = newself
}
}

var myst = MyStruct(i: 1)
println("ptr(init): \(ptr(&myst)), \(myst.i)")
myst.mutate(2)
println("ptr(aftr): \(ptr(&myst)), \(myst.i)")

输出:

ptr(init): 0x00007fff57839a70, 1
ptr(news): 0x00007fff57839040, 2
ptr(aftr): 0x00007fff57839a70, 2

无效 :(

--

我的问题是如何实现像Array 这样的struct?我知道这不是问题,我相信地址在 Swift 中没有意义,但这只是出于好奇。

最佳答案

您的第一个示例没有显示您的想法。您没有得到指向 ary 的指针。相反,您得到的是指向 ary 的第一个元素的指针。您可以将包含 &T 数组传递给期望指向 T 的参数,如 this Swift blog article 中所述。 ,在“作为数组参数的指针”下。

如果你把ptr改成

func ptr(x:UnsafePointer<[Int]>) -> UnsafePointer<Void> {
return UnsafePointer<Void>(x)
}

然后运行您的第一个示例,您将看到 ary 的地址没有改变。

关于ios - 了解 Swift 的数组实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26008086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com