在过去的几天里,我开始 swift 地面对一些看起来很简单的事情,但这让我大吃一惊。
我有一个类型为 [[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 时引用的数组没有改变?这是一个新的值(value)吗?
感谢任何解释。
最佳答案
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:
关于在 View Controller 之间传递数据。让我向您展示我修改 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)
}
}
关于ios - 使用 if var = 快速修改数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38615252/