Swift 对象数据存储方案常用方案为:
- Coredata
- RealmSwift
- UserDefaults
开发中有这么一种心理: 存储的对象只有一个, 使用Coredata和RealmSwift有些纠结是不是大材小用了
这篇告诉你如何优雅的把对象存储在UserDefaults
核心思想:Codable
协议
- 首先看模型构建, 如果要存枚举, 那么枚举也需要遵循
Codable
协议
// 遵循 ```Codable```协议结构体
struct TestCodableModel: Codable {
var name = ""
var type = TestType.normal
}
// 遵循 ```Codable```协议 的枚举
enum TestType: String, Codable {
case normal = "normal"
case firstType = "firstType"
}
- 优雅的写一个UserDefaults存储类
class CPUserDefaults {
static let sheard = CPUserDefaults()
// 测试模型数据
var testData: Data {
get {
return UserDefaults.standard.data(forKey: "testData") ?? Data()
}
set {
UserDefaults.standard.setValue(newValue, forKey: "testData")
UserDefaults.standard.synchronize()
}
}
// 测试数据模型
var testModel: TestCodableModel? {
get {
do {
// chargeModel get方法中调用 testData的get方法, 转模型返回
return try JSONDecoder().decode(TestCodableModel.self, from: testData)
} catch {
return nil
}
}
set {
do {
// chargeModel set方法中把chargeModel实例转成testData, 再调用testData的set方法存入UserDefaults
testData = try JSONEncoder().encode(newValue)
} catch {
print("存储失败")
}
}
}
}
- 存
// 实例化一个模型
let model = TestCodableModel(name: "测试", type: .firstType)
CPUserDefaults.sheard.testModel = model
- 取
let model = CPUserDefaults.sheard.testModel
print("model = \(model)")
输出: model = Optional(TestCoredata.TestCodableModel(name: "测试", type: TestCoredata.TestType.firstType))
- 当然可以将项目中的所有要存在UserDefaults中的值整理到 这个管理类
var
一个属性的事情
var token: String {
get {
return UserDefaults.standard.string(forKey: "token") ?? ""
}
set {
UserDefaults.standard.setValue(newValue, forKey: "token")
UserDefaults.standard.synchronize()
}
}
var isLogin: Bool {
get {
return UserDefaults.standard.bool(forKey: "isLogin")
}
set {
UserDefaults.standard.setValue(newValue, forKey: "isLogin")
UserDefaults.standard.synchronize()
}
}
温馨提示啊: OC也可以充分运用属性的set
与 get
方法把UserDefaults整理在一个类中
网友评论