如何将NSMutableArray作为对Swift中NSMutableDictionary部分的引用?

时间:2015-01-28 11:46:45

标签: ios swift nsmutablearray nsmutabledictionary

class PLCalendarEventViewController: UITableViewController {
    var event: NSMutableDictionary!

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == PLCalendarEditEventLinksSegueIdentifier {
            let tvc = segue.destinationViewController as PLCalendarEditEventLinksTableViewController
            if var links = event.objectForKey("links") as? NSMutableArray {
                tvc.data = links
            }
        }
    }
}

但在我的PLCalendarEditEventLinksTableViewController内,当我尝试data.addObject("new link")时,我会收到以下错误:

mutating method sent to immutable object

我需要做的就是当我更改NSMutableArray内部PLCalendarEditEventLinksTableViewController时我在event: NSMutableDictionary内更改PLCalendarEventViewController

class PLCalendarEditEventLinksTableViewController: UITableViewController {
    var data = NSMutableArray()
}

在Objective-C中非常简单,但是如何在Swift中执行此操作?

1 个答案:

答案 0 :(得分:1)

可以使用这个简单的脚本重现此问题:

import Foundation

let userDefault = NSUserDefaults.standardUserDefaults()

let obj: NSMutableDictionary = ["test": NSMutableArray(array: ["foo", "bar"])]
userDefault.setObject(obj, forKey: "key")

let obj2 = userDefault.objectForKey("key") as NSMutableDictionary
if let ary = obj2["test"] as? NSMutableArray {
    ary.addObject("baz")
}

您可以将NSMutableArray存储到NSUserDefaults,但是当从中检索它时,它实际上是一个不可变数组。见the docs

  

NSUserDefaults返回的值是 immutable ,即使您将可变对象设置为值。

我不知道实际event是如何构建的,但不管怎样,你必须深度复制它到可变容器。 AFAIK,最简单的方法是使用CFPropertyListCreateDeepCopy()。在构建event属性的位置:

event = CFPropertyListCreateDeepCopy(nil, event, CFPropertyListMutabilityOptions.MutableContainers.rawValue) as NSMutableDictionary