我有一个数组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时引用的数组没有变异?这是一个新的价值吗?
感谢您的任何解释。
答案 0 :(得分:3)
1)[String:Any]
不是数组,而是Dictionary<String, Any>
。我认为您的意思是myArray
类型[[String:Any]]
2)Array
和Dictionary
类型在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)
}
}