【问题标题】:Understanding Array implementation of Swift理解 Swift 的数组实现
【发布时间】:2014-11-18 10:14:06
【问题描述】:

出于好奇,我用 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 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 中毫无意义,但这只是出于好奇。

【问题讨论】:

    标签: ios macos memory-management swift


    【解决方案1】:

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

    如果您将ptr 更改为

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

    然后运行你的第一个例子,你会看到ary的地址没有改变。

    【讨论】:

    • 谢谢,你是对的。我想,我对文件感到困惑(developer.apple.com/library/prerelease/mac/documentation/Swift/…)。我想,将 any type 与“in-out expression”传递给UnsafePointer&lt;Void&gt; 可以得到变量的地址。 Array 不是这样,对吧?
    • @rintaro:我猜不是。在这种情况下,你想要什么是模棱两可的,我认为他们选择的不是你想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多