使用if var =在swift中修改数组

时间:2016-07-27 14:04:43

标签: ios arrays swift

在过去的几天里,我开始迅速地面对一些看起来如此简单的事情,但这让我大吃一惊。

我有一个数组myArray,类型为[[String:Any]]。

我只想通过在其中添加内容来修改数组:

    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 个答案:

答案 0 :(得分:3)

1)[String:Any]不是数组,而是Dictionary<String, Any>。我认为您的意思是myArray类型[[String:Any]]

2)ArrayDictionary类型在swift中按值传递,而不是通过引用传递。所以tempValue是具有相同值的不同实例

您可以尝试以下代码:

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

<强>更新

认为这个答案标记为正确,我发现了问题。似乎(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:

关于在视图控制器之间传递数据。让我向您展示我的firstViewController来自secondViewController的修改设置的解决方案之一。首先我定义设置类:

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