【问题标题】:Swift updating child array updates parent array as wellSwift 更新子数组也会更新父数组
【发布时间】:2016-06-27 13:54:59
【问题描述】:

这是我的代码。

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

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 中删除。

我觉得我做错了什么。 希望大家帮忙。

谢谢。

【问题讨论】:

  • 你的缩进喝醉了。
  • 当您对数组执行 for 循环 (model.arrSubModel) 时,您永远不应该从数组中删除/插入元素。你会有意想不到的行为/内容。
  • 你到底想达到什么目的?什么是示例输入和示例输出?
  • 你的代码真的很难阅读,因为你已经把它概括得太多了。你想做什么?
  • @CodeDifferent,所以基本上我试图根据某些条件过滤arrMyModel并将其设置为arrFilterModel。当我在arrMyModel 上过滤 String、Int 等变量时,一切正常。但是当我更改arrFilterModel 中的数组时,它也会更新arrMyModel 中的数组,希望它能让一切变得清晰。

标签: arrays swift for-loop model


【解决方案1】:

如果你更清楚地表达你的意图,这个问题会更容易回答

  • 由于疯狂的缩进,您的代码难以阅读
  • 由于过度概括,您的代码难以理解
  • 您的代码没有遵循 Swift 的不变性和纯函数原则。

据我所知,您希望根据某些条件将 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
}

我建议您将其更改为不滥用对象状态,并改为使用参数/返回:

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

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

【讨论】:

  • 我尝试了两种解决方案,这仍然改变了我的arrMyModel
  • 需要注意的是,在我更新数组 Inside arrFilterModel 之前一切正常。当我更新arrFilterModel 中的数组时,它也会更新arrMyModel 中的数组。
  • @ZaidPathan 哦,那是因为您使用的是类而不是结构。
  • 是的,将模型从 Class 更改为 Struct 有效,非常感谢兄弟!请更新您的答案,以便我接受。
  • @ZaidPathan 我认为您缺乏对引用与值语义以及类与结构的理解。 developer.apple.com/library/ios/documentation/Swift/Conceptual/…
猜你喜欢
  • 2019-07-20
  • 2022-01-13
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 2018-02-20
  • 2018-04-18
  • 2018-11-18
  • 2019-02-17
相关资源
最近更新 更多