2016-07-27 53 views
1

從這個日子開始,我正面臨一些看起來如此簡單的事情,但這讓我感到很頭疼。修改數組在swift中使用if var =

我有一個[[String:Any]]類型的數組myArray。

我想只是想通過在其添加的東西來修改數組:

if var tempValue = self.myArray[0]["values"] as? [AnyObject] { 
     tempValue.append("hello") 
     // if i print content of self.myArray it is empty 
     self.matches[0]["values"] = ["hello", "hello2"] 
     // this lines does work 
    } 

我不明白爲什麼當我變異tempValue引用的數組不被突變?這是一個新的價值嗎?

感謝您的任何解釋。

+1

'[字符串:任何]'這不是一個數組,但字典 –

+4

*「引用的數組......」 * - 您的問題從這裏開始。數組是*值類型*。 –

+0

對不起,Ozgur。我編輯了它。 – user2434385

回答

3

1)[String:Any]不是數組,它是Dictionary<String, Any>。我想你的意思是myArray有型[[String:Any]]

2)ArrayDictionary類型的經過值迅速,而不是參考。所以tempValue是不同的情況下有相同的價值觀

你可以試試這個代碼:

(self.myArray[0]["values"] as? [AnyObject])?.append("hello") // - wrong!! 

UPDATE:

思考這個答案標記爲正確的,我發現問題了。看起來像(self.myArray[0]["values"] as! [AnyObject])(即使用力展開)的結果將是不可改變的數組。所以你不能在其中使用append方法。你需要覆蓋整個鍵用新的數組:

if var tempValue = self.myArray[0]["values"] as? [AnyObject] { 
    tempValue.append("hello") 
    self.myArray[0]["values"] = tempValue 
} 

更新2:

關於視圖控制器之間傳遞數據。讓我向您展示我的一個解決方案,用於從secondViewController修改firstViewController的設置。首先,我定義設置類:

class ControllerSettings: NSObject { 
    var userInfo = Dictionary<String, AnyObject?>() 
    var myArray = [AnyObject]() 
    override var description: String {return "- userInfo: \(userInfo)\n - myArray: \(myArray)"} 
} 

firstViewController將使用settings屬性將它保存設置,並通過引用此屬性,以孩子secondViewController; secondViewController後會修改和罷免,firstViewController將能夠檢查變化viewWillAppear方法

class FirstViewController: UIViewController { 
    var settings = ControllerSettings() 
    //... 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
     print("here is actual settings:\n\(settings)") 
     //... 
    } 
    //... 

    func showSecondController() { 
     let secondViewController = SecondViewController() 
     secondViewController.firstViewControllerSettings = settings 
     presentViewController(secondViewController, animated: true, completion: nil) 
    } 
} 

class SecondViewController: UIViewController { 
    var firstViewControllerSettings: ControllerSettings? 
    //... 

    func mutateSettingsAndDismiss() { 
     firstViewControllerSettings?.myArray.append("NewSetting") 
     dismissViewControllerAnimated(true, completion: nil) 
    } 
} 
+1

完美謝謝。所以我需要使用NSMutableArray才能夠使用引用?如果我想在UIViewControllers之間傳遞數據,並且我想從一個控制器更改其他數據的數據。我怎樣才能做到這一點 ?謝謝你,兄弟。 – user2434385

+0

@ user2434385我在回答中發現問題,請檢查更正。如果你有嵌套的變異數組/字典的複雜數據,那麼我建議你爲這個需求編寫自定義類。 –

+0

謝謝你,你知道這種定製類的任何教程或例子嗎? – user2434385