【问题标题】:How to use NSUserDefaults to store an array of dictionaries如何使用 NSUserDefaults 存储字典数组
【发布时间】:2016-01-13 17:27:35
【问题描述】:

尝试使用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]

给出错误:

无法将“[[String:Any]]”类型的值转换为“AnyObject”类型的预期参数?

【问题讨论】:

    标签: arrays swift persistence nsuserdefaults


    【解决方案1】:

    Swift 3.x

    在 Swift 3 中它发生了变化,所以现在需要将它保存为 [Any] Any Array 并使用 UserDefaults array(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")
        }
    }
    


    Swift 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 创建计算属性,为您完成所有幕后工作,如下所示:

    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]]
    

    【讨论】:

    • 这不起作用,因为 theTask 必须是 [[String:Any]] 才能允许编辑内容。
    • 我已经更新了我的问题以包含新变量 selected 如果我更改为 [AnyObject] 我收到错误 Cannot subscript a value of type '[AnyObject'
    • 我知道这不是为了感谢 cmets 但@LeoDabus 非常感谢你,我什至不知道 getter 和 setter。效果很好! :)
    【解决方案2】:

    直接从NSUserDefaults()调用.setObject()方法就可以了。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-15
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多