我一直在尝试在我的代码中调试一些东西并遇到了这个问题。您可以将其直接放在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
答案 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 controller
和destination view controller's
变量指向内存中的相同位置。这解释了为什么我通过与@Nirav的对话解释了级联向下的变化。
感谢您的回复。