第三方庫SwiftUserDefault使用

項目簡介

源碼地址
SwiftUserDefault對系統的UserDefault進行了一層封裝,可以簡化基礎數據和自定義對象的存取

使用方式

1、cocoapods集成,也可以直接將文件下載下來(就一個文件)
2、創建自己需要的DefualtKeys

extension DefaultsKeys {
    static let keyString = DefaultsKey<String?>("keyString")
    static let keyInt = DefaultsKey<Int>("keyInt")
    static let keyBool = DefaultsKey<Bool?>("keyBool")
    static let keyDic = DefaultsKey<[String: Any]?>("keyDic")
    static let keyColor = DefaultsKey<UIColor?>("keyColor")
    
    static let keyStudent = DefaultsKey<SXDefaultStudent?>("keyStudent")
    
}

其中SXDefaultStudent是自定義對象,自定義對象如果需要使用的話,需要完成歸解檔,如下:

class SXDefaultStudent: NSObject, NSCoding {
    let keyCodeName = "keyCodeName"
    let keyCodeAge = "keyCodeAge"
    let keyCodeAddress = "keyCodeAddress"
    
    
    var name: String?
    var age: Int = -1
    var address: SXDefaultAddress?
    
    override init() {
        super.init()
    }
    
    func encode(with aCoder: NSCoder) {
        aCoder.encode(self.name, forKey: self.keyCodeName)
        aCoder.encode(self.age, forKey: self.keyCodeAge)
        aCoder.encode(self.address, forKey: self.keyCodeAddress)
    }
    
    required init?(coder aDecoder: NSCoder) {
        self.name = aDecoder.decodeObject(forKey: self.keyCodeName) as? String
        self.age = aDecoder.decodeInteger(forKey: self.keyCodeAge)
        self.address = aDecoder.decodeObject(forKey: self.keyCodeAddress) as? SXDefaultAddress
    }
    
    override var description: String {
        let str = self.name ?? ""
        return str
    }

}

class SXDefaultAddress: NSObject, NSCoding {
    let keyCodeProvince = "keyCodeProvince"
    let keyCodeStreet = "keyCodeStreet"
    
    var province: String?
    var street: String?
    
    override init() {
        super.init()
    }
    
    required init?(coder aDecoder: NSCoder) {
        self.province = aDecoder.decodeObject(forKey: self.keyCodeProvince) as? String
        self.street = aDecoder.decodeObject(forKey: self.keyCodeStreet) as? String
    }
    
    func encode(with aCoder: NSCoder) {
        aCoder.encode(self.province, forKey: self.keyCodeProvince)
        aCoder.encode(self.street, forKey: self.keyCodeStreet)
    }
    
}

其中student中除了基礎數據,還有一個自定義的address
3、定義下標訪問方式,如果不定義,就不能通過下標的方式訪問,只能使用下面的方式

Defaults.set(DefaultsKeys.keyStudent, student)

正確的方式

extension UserDefaults {
    subscript(key: DefaultsKey<SXDefaultStudent?>) -> SXDefaultStudent? {
        get { return unarchive(key) }
        set { archive(key, newValue) }
    }
    
    subscript(key: DefaultsKey<[String: Any]?>) -> [String: Any]? {
        get { return unarchive(key) }
        set { archive(key, newValue) }
    }  
}

4、測試代碼

// 自定義類型,類型中又包含自定義類型
        let student = SXDefaultStudent()
        student.name = "guandi"
        student.age = 28
        let addr = SXDefaultAddress()
        addr.province = "hunan"
        addr.street = "baoli"
        student.address = addr
        Defaults.set(DefaultsKeys.keyStudent, student)
        Defaults[DefaultsKeys.keyStudent] = student
        
        // 基礎類型測試
        Defaults[.keyString] = "keyStringTest"
        Defaults[.keyInt] = 12
        Defaults[.keyDic] = ["testKey": "testValue"]
        Defaults[.keyDic]?["student"] = student
        
        var str = ""
        str.append(Defaults[.keyString] ?? "")
        str.append("\n")
        str.append("\(Defaults[.keyInt])")
        str.append("\n")
        print(str)
        
        if let dic = Defaults[.keyDic], let value = dic["testKey"] {
            print(value)
        }
        
        if let dic = Defaults[.keyDic], let value = dic["student"] {
            print(value)
        }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容