swift 自定义@

平时存东西,总用到 UserDefaults,每次使用取的时候很麻烦,提供一个好的简单的方案

1.自定义 @LsqUserDefault

importUIKit

///注意 T 只能是Codable数据类型

@propertyWrapper

public struct LsqUserDefault {

    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: Codable {

    var key: String?

    var value: T?

}

///注意 T 只能是Codable数据类型, 并且不能为空

@propertyWrapper

public struct LsqUserDefaultValue {

    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(.....)

    }

}

你可能感兴趣的:(swift 自定义@)