ios - 将自定义对象保存到 NSUserDefaults

标签 ios swift nsuserdefaults

我想将我的对象保存到 NSUserDefaults 中。

这是我的模型:

 class User: SafeJson {
    var email: String?
    var name: String?
} 

SafeJson:

  class SafeJson: NSObject {

    override func setValue(_ value: Any?, forKey key: String) {

        let uppercasedFirstCharacter = String(key.first!).uppercased()
        let range = NSMakeRange(0, 1)
        let selectorString = NSString(string: key).replacingCharacters(in: range, with: uppercasedFirstCharacter)

        let selector = NSSelectorFromString("set\(selectorString):")
        let responds = self.responds(to: selector)

        if !responds {
            print("\n\n\n*******--->\(selector) key is missing in API response...<---*******\n\n\n")
            return
        }

        super.setValue(value, forKey: key)
    }
} 

通过以下方式创建UserObj:

let UserObj = User()
UserObj.setValuesForKeys(responseOfAPI)    

现在我想将 UserObj 保存到 NSUserDefaults 但不知道该怎么做...

而且我不想在我的模型类中使用 required init(coder aDecoder: NSCoder)func encode(with aCoder: NSCoder) 因为有太多用户模型的许多属性。

谢谢!!

最佳答案

通常,您无法将对象序列化为UserDefaults

但是,由于您使用的是 JSON,因此可以使用 Codable类型将对象转换为 JSON 或从 JSON 转换以进行存储。

[*]需要注意的是 Any 不可编码。使类型可编码的最简单方法是使用已可编码的类型声明其属性。这些类型包括标准库类型,例如 StringIntDouble;以及基础类型,例如 DateDataURL。任何属性可编码的类型只需声明一致性即可自动符合 Codable。

这是一个简化的示例:

//: Playground - noun: a place where people can play

import UIKit

class SafeJson: Codable {
    var strValues:[String:String] = [:]
    var intValues:[String:Int] = [:]

    func setValue(_ value: String?, forKey key: String) {
        strValues[key] = value
    }

    func setValue(_ value: Int?, forKey key: String) {
        intValues[key] = value
    }
}

let encoder = JSONEncoder()
let decoder = JSONDecoder()

let sampleObject = SafeJson()
sampleObject.setValue(12, forKey: "intValue1")
sampleObject.setValue(12345, forKey: "intValue2")
sampleObject.setValue("Banana", forKey: "yellowFruit1")
sampleObject.setValue("Orange", forKey: "orangeFruit1")

let encoded = try encoder.encode(sampleObject)
let key = "encodedObj"
UserDefaults.standard.setValue(encoded, forKey: key)


if let readValue = UserDefaults.standard.value(forKey: key) as? Data {
    let decodedObj = try decoder.decode(SafeJson.self, from: readValue)
    print("Decoded to \(decodedObj)")
}

关于ios - 将自定义对象保存到 NSUserDefaults,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50683025/

相关文章:

ios - 国际化 UIButton

ios - 滚动经过第一行时 UICollectionView 崩溃

ios - 安全地存储数据,应用程序如何做到这一点?

ios - WatchKit NSUserDefaults 为空

ios - 关闭 UIScrollView 中的缩放

swift - 在不影响老用户的情况下更新代码流

ios - 如何快速获取iPhone设备本地存储的文档[pdf,docx,doc,xlsxl]

swift - 如何测试 Swift 字典中是否不存在键?

ios - 如何在 objective-c 中为每个用户在其整个生命周期中只运行一次代码

objective-c - 在 ios 中添加对象崩溃