即使在推送segue时声明不同,同一类的对象也具有相同的属性

时间:2017-10-06 16:55:28

标签: ios swift

我一直试图解决我的应用程序中的问题,导致我无法获得所需的结果。

将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

到底发生了什么以及为什么这两个对象具有相同的属性,即使我已经以不同方式声明它们?

1 个答案:

答案 0 :(得分:0)

我猜测Person可能是class,而不是struct。这意味着它是一个引用类型,当你:

var mutableBill = bill

你实际上并没有复制bill,而是另一个对同一个对象的引用。因此,当您更改mutableBill上的属性时,您还会更改bill上的属性,因为它们都指向同一个对象。

解决方案是制作bill的实际副本。这两个选项要么将Person声明为struct,在这种情况下,您将始终获得副本,或者在Person上创建另一个Person的初始值设定项并使用传入的Person属性初始化自己:

init(person: Person) { ... }