0

在这里我试图更新索引中的特定值,但它更新了所有索引

class salarty  {

var sal_id                        :String = ""
var sal_amount             :String = ""
var sal_iScreated          :Bool = false

init(sal_id : String, sal_amount : String, sal_iScreated: Bool){

   self.sal_id                =  sal_id
   self.sal_amount     =  sal_id
   self.sal_iScreated =  sal_id

}
}

class Employee {

    let id: Int, firstName: String, lastName: String
    var salaryArray  :[salarty]  = [salarty]()


    init(id: Int, firstName: String, lastName: String, salaryArray: [salarty]) {
        self.id = id
        self.firstName = firstName
        self.lastName  = lastName
        self.salaryArray = salaryArray
    }
     }


array_SalaryDetails.append(salarty(sal_id : "2", sal_amount : "3000", sal_iScreated: false))

let employeeArray = [
    Employee(id: 1, firstName: "Jon", lastName: "Skeet",salaryArray :array_SalaryDetails),
    Employee(id: 2, firstName: "Darin", lastName: "Dimitrov",salaryArray :array_SalaryDetails),
    Employee(id: 4, firstName: "Hans", lastName: "Passant",salaryArray :array_SalaryDetails)
]

在这里我尝试了一些代码它不起作用

方法一:

var model  = Employee[(indexPath?.section)!].salaryArray
        let model2 = model[(indexPath?.row)!]
        model = model.map{
            let mutableval = $0
            if $0.sal_id == model2.sal_id {
                mutableBook.sal_iScreated = !model2.sal_iScreated
            }
            return mutableval
        }

方法二:

    let model  = array_Main[(indexPath?.section)!].serviceArray
    let model2 = model[(indexPath?.row)!]

    model2.service_isSelected = !model2.service_isSelected
4

1 回答 1

2

那是因为在Swift类的实例中是通过引用而不是通过值传递的。

因此,您创建并传递给多个 Employee 对象的薪水数组最终引用了相同的薪水对象。因此,更改任何 Employee 对象中任何数组中的薪水值将反映所有 Employee 对象的更改

两种可能的解决方案:

解决方案 1:首选解决方案

改变salartystruct和不是class,如果可能的话,也改变薪水的拼写:P

struct salarty  {
        
        var sal_id                        :String = ""
        var sal_amount             :String = ""
        var sal_iScreated          :Bool = false
        
        init(sal_id : String, sal_amount : String, sal_iScreated: Bool){
            
            self.sal_id                =  sal_id
            self.sal_amount     =  sal_id
            self.sal_iScreated =  sal_iScreated
            
        }
    }

解决方案2:

在分配之前为每个 Employee 创建一个工资数组的深层副本。

class salarty : NSObject, NSCopying  {
    func copy(with zone: NSZone? = nil) -> Any {
        let copy = salarty(sal_id: self.sal_id, sal_amount: self.sal_amount, sal_iScreated: self.sal_iScreated)
        return copy
    }
    
    
    var sal_id                        :String = ""
    var sal_amount             :String = ""
    var sal_iScreated          :Bool = false
    
    init(sal_id : String, sal_amount : String, sal_iScreated: Bool){
        
        self.sal_id                =  sal_id
        self.sal_amount     =  sal_id
        self.sal_iScreated =  sal_iScreated
        
    }
}

对于每个员工,您可以使用以下任一方法创建一个新数组

    array_SalaryDetails.append(salarty(sal_id : "2", sal_amount : "3000", sal_iScreated: false))
    //salary array copy for first employee
    var firstEmployeearrayCopy = [salarty]()
    for salary in array_SalaryDetails {
        firstEmployeearrayCopy.append(salary.copy() as! salarty)
    }
    Employee(id: 1, firstName: "Jon", lastName: "Skeet",salaryArray : firstEmployeearrayCopy)

    //salary array copy for second employee
    var secondEmployeearrayCopy = [salarty]()
    for salary in array_SalaryDetails {
        secondEmployeearrayCopy.append(salary.copy() as! salarty)
    }
    Employee(id: 2, firstName: "Darin", lastName: "Dimitrov",salaryArray :secondEmployeearrayCopy)

或者您可以为每个员工再次创建数组 n 。

在swift中,数组按值传递的,但数组中的对象(类的实例)仍将通过引用传递,因此您必须执行所有这些解决方法:)

一点建议:

类名应以大写字母开头。只有变量名称遵循驼峰式大小写。

希望能帮助到你

于 2018-06-14T07:46:48.567 回答