为什么此词典中的值会发生变化?

时间:2017-01-12 05:16:27

标签: ios swift3 nsdictionary

我一直在尝试在我的代码中调试一些东西并遇到了这个问题。您可以将其直接放在playground中。

import UIKit

class testObj {
    var prop1: Int?
}

var testObjInst = testObj()

var myDic : [String : testObj] = [:]

testObjInst.prop1 = 1
myDic["A"] = testObjInst
testObjInst.prop1 = 2
myDic["B"] = testObjInst
testObjInst.prop1 = 3
myDic["C"] = testObjInst

print(myDic["A"]?.prop1) //prints 3

if let myVal = myDic["A"] {
    myVal.prop1 = 5
}

print(myDic["A"]?.prop1) //prints 5

myVal变量如何更改myDic["A"]的值?不应将myVal分配给调用myDic["A"]的结果,并且此调用的返回最终将是对象的新实例?

编辑1:我的segues是这样执行的:

    if segue.identifier == segueIDs.air {
        if let vc = segue.destination as? PointsTableViewController {
            //these are the dictionaries. 
            vc.rewardProgramsDic = rewardProgramsDic
        }
    }

我遇到的问题是在destination viewController设置了一个属性,当我按back并打印rewardProgramsDic中的值时价值会发生变化。我尝试在breakpoints上设置rewardProgramsDic以及使用didSet尝试捕获更改,但在destination {{更新属性时,这些都不会被调用1}}。

编辑2:

在原始viewController

viewController

在目的地var rewardProgramsDic: [String: IndividualRewardProgram] = [:]

tableViewController

2 个答案:

答案 0 :(得分:1)

在这里,您获得了这样的结果,因为您使用的是 Class

  

类是引用类型&引用类型不会被复制   被赋值给变量或常量,或者当它们被传递给a时   功能

通过更新对象值来表示将更新实际分配的所有实例。在上面的例子中,

testObjInst.prop1 = 1
myDic["A"] = testObjInst // myDic["A"]?.prop1 :- 1
testObjInst.prop1 = 2
myDic["B"] = testObjInst // myDic["B"]?.prop1 :- 2 & myDic["A"]?.prop1 :- 2
testObjInst.prop1 = 3
myDic["C"] = testObjInst // myDic["C"]?.prop1 :- 3 & myDic["B"]?.prop1 :- 3 & myDic["A"]?.prop1 :- 3

if let myVal = myDic["A"] { //So Here, myDic["A"]?.prop1 :- 3
    //Here, myDic["A"] class instance is assigned to myVal object, 
    //So changing value in myVal object directly reflect in all object.
    myVal.prop1 = 5 // myDic["A"]?.prop1 :- 5 & myDic["B"]?.prop1 :- 5 & myDic["C"]?.prop1 :- 5
}

答案 1 :(得分:0)

使用此功能:

func address<T: AnyObject>(o: T) -> Int {
    return unsafeBitCast(o, to: Int.self)
}

并将其称为parent view controller,如下所示:

print(NSString(format: "%p", address(o: rewardProgramsDic["ID1"]!))) 

然后在destination view controller中调用同一个函数,我确认parent view controllerdestination view controller's变量指向内存中的相同位置。这解释了为什么我通过与@Nirav的对话解释了级联向下的变化。

感谢您的回复。