修改数组在 swift 如果使用 var =

标签: ios Swift
发布时间: 2017/3/6 23:27:40
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

开始 swift 过去的一天,我面临的一些看起来如此简单,但这让我吹我的脑海。

我有 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:

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:

关于视图控制器之间传递数据。让我告诉你一个我的解决方案为修改设置的 firstViewControllersecondViewController 。本文首先定义设置类︰

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)
    }
}
赞助商