ios - 使用 if var = 快速修改数组

标签 ios arrays swift

在过去的几天里,我开始 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) 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:

关于在 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/

相关文章:

arrays - swift:比较2个字符数组,从每个字符数组中删除一个值

jQuery 解析 JSON 对象和数组

自定义类的 PHP 数组

ios - collectionview - 滚动前缩放中心单元

ios - 如何让一个操作等待另一个操作快速完成

ios - 快速迭代字符长度

ios - 如何获得 SKProduct 的本地货币 |在 Swift 中显示 IAP 价格

ios - NSMutableDictionary:发送到不可变对象(immutable对象)的变异方法

ios - 跟踪对象是否发布到服务器(例如 snapchat)

ios - Firebase 观察者事件类型