【问题标题】:Swift reference vs value with arrays and dictionariesSwift 引用与数组和字典的值
【发布时间】:2015-10-10 22:21:50
【问题描述】:

简而言之, 我创建了一个由整数和字符串数组组成的对象。 我在整数和数组中都放了一些东西 我将对象放入字典
我获得了对该对象的新引用并尝试追加到数组中。这就是失败的地方

//: Playground - noun: a place where people can play

class IdAndArray {
    var id: Int = 0
    var stringArray:[String] = [String]()
}

var dict:[Int:IdAndArray] = [Int:IdAndArray]()

var testRec = IdAndArray()
testRec.id = 1
testRec.stringArray.append("1 line")

dict[56] = testRec

var ref = (dict[56]?.stringArray)!
print(ref.count) // 1
ref.append("2 line")

var anotherRef = (dict[56]?.stringArray)!
print(anotherRef.count) // 1 instead of 2???

我怀疑这可能与此有关: Implementing a multimap in Swift with Arrays and Dictionaries

我也怀疑这与选项有关,但我用 ! 强制展开

为了记录,我来自 java 背景。

【问题讨论】:

    标签: arrays swift dictionary


    【解决方案1】:

    Swift 数组和字典是 value 类型。当您将一个变量中的一个变量分配给另一个变量时,您就是在复制原始变量。

    所以当你这样做时:

    var ref = (dict[56]?.stringArray)!
    

    ref 是数组的全新副本,而不是字典中的副本,因此修改它对字典中的原始副本没有影响。

    如果你这样做了:

    dict[56]?.stringArray.append("2 line")
    

    那么您将修改字典中的副本。


    注意:实际上,在您修改其中一个副本之前,Swift 不会复制该数组。这是在幕后完成的,以避免不必要的复制并保持快速。副本逻辑上在您分配时立即发生,但在您开始修改其中一个副本之前您不会注意到差异,因此 Swift 会延迟副本直到重要为止。


    现在考虑对您的代码进行此更改:

    var ref = dict[56]!
    print(ref.stringArray.count) // 1
    ref.stringArray.append("2 line")
    
    var anotherRef = dict[56]!
    print(anotherRef.stringArray.count) // 2 this time!!!
    

    这里,ref 指向 class 的一个实例,它是一个 reference 类型。在这种情况下,refanotherRef 都指向同一个对象,因此您这次修改的是字典中的数组。

    【讨论】:

    • 感谢您的教育!第二部分完美运行,但“(dict [56]?.stringArray)!.append(“2 line”)”导致“错误:不能在操场上使用'[String]'类型的不可变值使用变异成员” xcode 7.01/swift 2.0
    • 嗯。请改用dict[56]?.stringArray.append("2 line")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 2015-05-10
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多