2016-01-13 27 views
0

尝试使用NSUserDefaults存储字典数组。如何使用NSUserDefaults存储字典数组

var theTasks: [[String:Any]] = [["num":1,"title":"example","colour":"red"]] 

let defaults = NSUserDefaults.standardUserDefaults() 
    defaults.setObject(theTasks, forKey: "myTasks") 
    defaults.synchronize() 

let selected = theTasks[1] 

给出错误:

Cannot convert value of type '[[String:Any]]' to expected argument of type 'AnyObject?'

回答

1

夫特3.x的

在夫特3它已所以现在需要将其保存为[Any]任何数组和使用UserDefaults阵列改变(forKey :)方法加载它:

let theTasks: [Any] = [["num": 1, "title": "example", "colour": "red"]] 
UserDefaults.standard.set(theTasks, forKey: "myTasks") 
if let loadedTasks = UserDefaults.standard.array(forKey: "myTasks") as? [[String: Any]] { 
    print(loadedTasks) 
} 

var theTasks: [[String: Any]] { 
    get { 
     return UserDefaults.standard.array(forKey: "myTasks") as? [[String: Any]] ?? [] 
    } 
    set { 
     UserDefaults.standard.set(newValue as [Any], forKey: "myTasks") 
    } 
} 


斯威夫特2.x的

你只需要把它保存为AnyObject数组,并使用NSUserDefaults方法arrayForKey加载它:

let theTasks: [AnyObject] = [["num": 1, "title": "example", "colour": "red"]] 
NSUserDefaults.standardUserDefaults().setObject(theTasks, forKey: "myTasks") 
if let loadedTasks = NSUserDefaults.standardUserDefaults().arrayForKey("myTasks") as? [[String: AnyObject]] { 
    print(loadedTasks) 
} 

你可以还要用getter和setter创建一个计算属性,以完成t后面的所有工作他的场景为你如下:

var theTasks: [[String: AnyObject]] { 
    get { 
     return NSUserDefaults.standardUserDefaults().arrayForKey("myTasks") as? [[String: AnyObject]] ?? [] 
    } 
    set { 
     NSUserDefaults.standardUserDefaults().setObject(newValue as [AnyObject], forKey: "myTasks") 
    } 
} 

print(theTasks)    // [["title": example, "colour": red, "num": 1]] 
theTasks[0]["title"] = "another example" 

print(theTasks)    // [["title": another example, "colour": red, "num": 1]] 
+0

为'theTask'需要是'[[字符串:任何]这是行不通的'允许的内容进行编辑。 –

+0

我已经更新了我的问题,包含新变量'selected',如果我更改为'[AnyObject]'我得到错误'不能下标值的类型'[AnyObject'' –

+1

我知道它并不意味着感谢评论,但@ LeoDabus非常感谢你,我甚至都不知道吸气和吸气。很棒! :) –

-1

只要打电话给.setObject()直接从NSUserDefaults()方法,它应该工作的罚款。

NSUserDefaults().setObject(theTasks, forKey: "myTasks")

相关问题