Swift 将对象(对象属性包含enum)优雅的存入UserDe

2022-11-09  本文已影响0人  YourSummer

Swift 对象数据存储方案常用方案为:

开发中有这么一种心理: 存储的对象只有一个, 使用Coredata和RealmSwift有些纠结是不是大材小用了
这篇告诉你如何优雅的把对象存储在UserDefaults

核心思想:Codable 协议

  1. 首先看模型构建, 如果要存枚举, 那么枚举也需要遵循 Codable协议
// 遵循 ```Codable```协议结构体
struct TestCodableModel: Codable {
    var name = ""
    var type = TestType.normal
}
// 遵循 ```Codable```协议 的枚举
enum TestType: String, Codable {
    case normal = "normal"
    case firstType = "firstType"
}
  1. 优雅的写一个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))
  1. 当然可以将项目中的所有要存在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也可以充分运用属性的setget方法把UserDefaults整理在一个类中

上一篇 下一篇

猜你喜欢

热点阅读