【问题标题】:How to use For Loop through keys of NSUserDefault Dictionary如何通过 NSUserDefault Dictionary 的键使用 For 循环
【发布时间】:2015-06-07 21:50:09
【问题描述】:

我无法从此计算属性 (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
    }

我的视图控制器:

import UIKit

class NameViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {


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

User Struct 带有转换成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() }
        ]
    }

}

【问题讨论】:

    标签: ios swift for-loop nsuserdefaults


    【解决方案1】:

    您可以使用 (from apple documentation) 获取所有键/值

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

    使用这个你可以循环字典中的所有元素

    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);
    

    【讨论】:

      【解决方案2】:

      正如马特在评论中指出的那样,您需要先将内容保存到 NSUserDefaults 才能阅读它们。

      其他会阻止您的代码工作的东西:

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

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

      【讨论】:

      • 谢谢,我在我的问题中添加了我的用户类,试图将结构转换为我可以存储在 NSUD 中的东西?
      【解决方案3】:

      这不是NSUserDefaults 的好用户,这意味着在应用程序启动之间存储首选项和其他少量数据。请参阅NSUserDefaults 上的文档。

      当你显示数据时,你应该在内存中管理这个用户字典,如果你想在应用程序启动之间将它持久化到磁盘,你应该使用 CoreData 或使你的 User 类符合 NSCoding 并读取/用归档来写。 Here's a nice tutorial

      【讨论】:

      • 谢谢,我知道 NSUD 的局限性,但只是用于测试,然后在 Core Data 或 Parse 中进行设置
      猜你喜欢
      • 1970-01-01
      • 2020-07-04
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 2017-03-05
      • 1970-01-01
      相关资源
      最近更新 更多