Swift更新子数组也更新父数组

时间:2016-06-27 13:55:00

标签: arrays swift for-loop model

这是我的代码。

我有一个模型,它包含另一个模型的数组。

class MyModel{
 var arrSubModel = [SubModel]()
}

class SubModel{
 var value1 = String()
 var value2 = String()
}

现在我的班级里有2个变量用于保存MyModel数组。

class MyVC:UIViewController {
    var arrMyModel = [MyModel1,MyModel2,MyModel3]
    var arrFilterModel = []

    func filter() {
        arrFilterModel = []

        for model in arrMyModel {
            for subModel in model.arrSubModel {
                if conditionMet {
                    //doNothing
                } else {
                    //remove that subModel
                    model.arrSubModel.removeObject(subModel)
                }
            }
            arrFilterModel.append(model)
        }
    }
}

但是当我再次访问arrMyModel时,arrSubModel会被删除,但只能从arrFilterModel中删除。

我想我做错了什么。 希望你们能帮忙。

谢谢。

1 个答案:

答案 0 :(得分:0)

如果您更明确地表达了您的意图,这个问题会更容易回答

  • 由于疯狂的缩进,您的代码难以阅读
  • 由于过度概括,您的代码难以理解
  • 你的代码并不遵循斯威夫特的不变性和纯函数学说。

根据我可以收集的内容,您希望arrFilterModel根据某些条件设置为arrMyModel的子集,而不会影响原始arrMyModel

有一种更简单的方式来做你正在尝试做的事情:

func giveMeABetterName() { //don't call it "filter", it's meaningless.
   let copy = arrMyModel
   let arrFilterModel = copy.map{$0.arrSubMode}.filter{$0 == foo} //substitute in the condition
}

我建议您将此更改为不滥用对象状态,并改为使用params / return:

func giveMeABetterName(source: [MyModel]) -> [SubModel] {
    return source.map{$0.arrSubMode}.filter{$0 == foo} //substitute in the condition
}

您还会遭受来自类的引用语义的无意数据共享。切换到结构的值语义将解决这个问题。