2016-06-27 155 views
0

這是我的代碼。Swift更新子數組更新父數組以及

我有一個模型,其中包含另一個模型的數組。

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) 
     } 
    } 
} 

,但是當我再次訪問arrMyModelarrSubModel從它刪除,但它應該從arrFilterModel只能去除。

我想我做錯了什麼。 希望你們能幫忙。

謝謝。

+1

您的縮排醉了。 – Alexander

+3

當您對該數組執行for循環('model.arrSubModel')時,不應該從/向數組中移除/插入元素。你會有意想不到的行爲/內容。 –

+0

你想要達到什麼目的?什麼是示例輸入和示例輸出? – Alexander

回答

0

這個問題就會簡單得多回答,如果你更清楚

  • 你的代碼是非常困難的,因爲瘋狂的壓痕
  • 你的代碼是非常難以理解,因爲的閱讀表達你的意圖,其過度泛化
  • 您的代碼並不遵循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 
} 

我建議你改變這種不濫用對象的狀態,並使用PARAMS /而是返回:

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

您還患有來自類的引用語義的無意數據共享。切換到結構的值語義會解決這個問題。

+0

我嘗試了兩種解決方案,這仍然改變我的'arrMyModel'。 –

+0

有一點需要注意的是,一切工作正常,直到我更新數組內'arrFilterModel'。 當我在'arrFilterModel'內更新數組時,它也更新'arrMyModel'內的數組。 –

+0

@ZaidPathan哦,那是因爲你使用了類而不是結構。 – Alexander