我一直试图解决我的应用程序中的问题,导致我无法获得所需的结果。
将segue推送到下一个视图控制器时,我将同一类的两个对象传递给var original:[Person] = []
和var edited:[Person] = []
if (segue.identifier == "showSummary") {
let vc = segue.destination as! SummaryViewController
vc.original = myObject
vc.edited = Bill.calculateBill(myObject, switchServiceCharge.isOn, switchGST.isOn)
vc.gst = (switchServiceCharge.isOn, switchGST.isOn)
}
在calculateBill
之前,内部属性的原始值为11。
calculateBill
是另一个类Bill中的类函数:
class func calculateBill(_ bill: [Person],_ svcCharge: Bool,_ GST: Bool) -> [Person] {
var mutableBill = bill
for i in 0 ..< mutableBill.count {
for j in 0 ..< mutableBill[i].items.count {
let tax = Bill.getGSTForIndividual(mutableBill[i].items[j].itemPrice, svcCharge, GST)
mutableBill[i].items[j].itemPrice += tax
}
}
return mutableBill
}
class func getGSTForIndividual(_ individualAmt: Decimal,_ svcCharge: Bool,_ GST: Bool) -> Decimal {
var taxCost : Decimal = 0.00
let SERVICE_CHARGE = Bill.getServiceCharge() //0.10
let GOODS_SERVICE_TAX = Bill.getGST() //0.07
if (svcCharge && GST) {
taxCost = individualAmt * SERVICE_CHARGE
taxCost = taxCost + ((individualAmt + taxCost) * GOODS_SERVICE_TAX)
}
else if (!svcCharge && GST) {
taxCost = individualAmt * GOODS_SERVICE_TAX
}
else if (svcCharge && !GST) {
taxCost = individualAmt * SERVICE_CHARGE
}
else {
taxCost = 0.00
}
return taxCost
}
当我做print()
来测试里面的属性是否不同时,它们都会以某种方式产生相同的结果......
print(original[0].items[0].itemPrice) //12.947000000000000123904, originally 11
print(edited[0].items[0].itemPrice) //12.947000000000000123904
到底发生了什么以及为什么这两个对象具有相同的属性,即使我已经以不同方式声明它们?
答案 0 :(得分:0)
我猜测Person
可能是class
,而不是struct
。这意味着它是一个引用类型,当你:
var mutableBill = bill
你实际上并没有复制bill
,而是另一个对同一个对象的引用。因此,当您更改mutableBill
上的属性时,您还会更改bill
上的属性,因为它们都指向同一个对象。
解决方案是制作bill
的实际副本。这两个选项要么将Person
声明为struct
,在这种情况下,您将始终获得副本,或者在Person
上创建另一个Person
的初始值设定项并使用传入的Person
属性初始化自己:
init(person: Person) { ... }