平时存东西,总用到 UserDefaults,每次使用取的时候很麻烦,提供一个好的简单的方案
1.自定义 @LsqUserDefault
importUIKit
///注意 T 只能是Codable数据类型
@propertyWrapper
public struct LsqUserDefault<T: Codable> {
let key: String
public init(key: String) {
self.key = key
}
public var wrappedValue: T? {
get {
guard let data = UserDefaults.standard.object(forKey: self.key) as? Data,
let value =try? JSONDecoder().decode(LsqUserDefaultModel.self, from: data) else {
return nil
}
return value.value
}
set {
if let v = newValue {
do{
let model =LsqUserDefaultModel(key: key, value: v)
let data =try JSONEncoder().encode(model)
UserDefaults.standard.set(data, forKey: self.key)
} catch {
print("LsqUserDefault存储失败key:\(key)")
}
} else {
UserDefaults.standard.removeObject(forKey: self.key)
}
}
}
}
///当单独存储 基本数据单元时,encode 会失败,所以搞个中间变量
public struct LsqUserDefaultModel<T: Codable>: Codable {
var key: String?
var value: T?
}
///注意 T 只能是Codable数据类型, 并且不能为空
@propertyWrapper
public struct LsqUserDefaultValue<T: Codable> {
let key: String
let defaultValue: T
public init(key: String, _ defaultValue: T) {
self.key = key
self.defaultValue= defaultValue
}
public var wrappedValue: T {
get {
guard let data = UserDefaults.standard.object(forKey: self.key) as? Data,
let value = try? JSONDecoder().decode(LsqUserDefaultModel.self, from: data) else {
return self.defaultValue
}
return value.value ?? self.defaultValue
}
set {
do {
let model =LsqUserDefaultModel(key: key, value: newValue)
let data =try JSONEncoder().encode(model)
UserDefaults.standard.set(data, forKey: self.key)
} catch {
print("LsqUserDefaultValue存储失败key:\(key)")
}
}
}
}
***使用方法***
1.首先我有个 model
struct MyTestModel: Codable {
varname:String?
varvalue:Int?
}
2.@LsqUserDefault(key: "你的名字,要唯一") 不能放在最顶层
struct App {
*没有默认值的多个存储
@LsqUserDefault(key: "AppConfigModelList")
static var testList: [MyTestModel]?
*没有默认值的单个存储
@LsqUserDefault(key: "AppConfigModelOne")
static var test: MyTestModel?
*带有默认值的存储
@LsqUserDefaultValue(key: "AppConfigModelNotNil", MyTestModel())
static var testNotNil: MyTestModel
*带有默认值的存储 基本数据类型
@LsqUserDefaultValue(key: "KisLoginKey", false)
static var isLogin:Bool
}
3使用------>>>>
class XxxxxCtr: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
///读取
let isLogin = App.isLogin
///存储
App.isLogin = true
///读取
let test = App.test
///存储
App.test = nil
App.test = MyTestModel(.....)
}
}
网友评论