如何使用NSUserDefault Dictionary的For Loop通过键

时间:2015-06-07 21:50:10

标签: ios swift for-loop nsuserdefaults

我无法从这个计算属性中获取值(userList)...我的init是否正确设置?我正在尝试构建一个列表,用于填充表视图中的行。 (*编辑:我用saveData函数编辑了我的问题,但是“无法使用类型的参数列表调用setObject”([String:User],forKey:String)“ -

import Foundation

class DataManager {

    static let sharedInstance = DataManager()

    var users = [String : User]()


    init() {
        let userDefaults = NSUserDefaults.standardUserDefaults()

        if let var userFromDefaults = userDefaults.objectForKey("userKey") as? [String : User] {

            users = userFromDefaults

        }

        else {
            // add default values later

        }


    }

   func saveData() {
    let userDefaults = NSUserDefaults.standardUserDefaults()
    userDefaults.setObject(users, forKey: "userKey")
}

    var userList: [String] {
        var list: [String] = []
        for name in users.keys {
            list.append(name)
        }
        list.sort(<)
        return list
    }

我的viewcontroller:

import UIKit

class NameViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {


    var users: [String] = DataManager.sharedInstance.userList

用户结构转换为json的方法:

import Foundation

struct User {
    var name = ""
    var stores: [Store] = []

    init?(json: [String: AnyObject]) {
        if let name = json["name"] as? String,
            storesJSON = json["stores"] as? [[String: AnyObject]]
        {
            self.name = name
            self.stores = storesJSON.map { Store(json: $0)! }
        } else {
            return nil
        }
    }

    init() { }

    func toJSON() -> [String: AnyObject] {
        return [
            "name": name,
            "stores": stores.map { $0.toJSON() }
        ]
    }

}

3 个答案:

答案 0 :(得分:2)

您可以使用(from apple documentation

获取所有键/值
  

dictionaryRepresentation()返回包含union的字典   搜索列表中域中的所有键值对。

使用它可以循环字典中的所有元素

for element in NSUserDefaults.standardUserDefaults().dictionaryRepresentation() {
        println(element)
        //Do what you need to do here
}

您也可以只检索密钥:

println(NSUserDefaults.standardUserDefaults().dictionaryRepresentation().keys.array);

或只是值

println(NSUserDefaults.standardUserDefaults().dictionaryRepresentation().values.array);

答案 1 :(得分:0)

Matt在评论中指出,您需要先将内容保存到NSUserDefaults,然后才能阅读。

阻止您的代码工作的其他因素:

NSUserDefaults只保存“属性列表”对象(NSString,NSData,NSDate,NSNumber,NSArray或NSDictionary对象或它们的Swift等价物。)

如果您尝试保存其他任何内容,或者包含除这些数据类型之外的任何内容的集合,则保存失败,当您尝试将其读回时,您将获得nil。您的代码显示您尝试保存字典,其中每个键的值是“User”类型的对象。这将失败,因为“用户”不是“属性列表”对象类型的短列表之一。

答案 2 :(得分:0)

这不是NSUserDefaults的好用户,它用于在应用启动之间存储首选项和其他一小部分数据。请参阅NSUserDefaults上的文档。

在显示数据时,您应该在内存中管理此用户词典,如果要在应用程序启动之间将其保留到磁盘,则应使用CoreData或使User类符合{{1}并使用存档读/写它。 Here's a nice tutorial