持久化存储序列化 1.1.2

持久化存储序列化 1.1.2

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最新发布2017年4月
SwiftSwift 版本3.1
SPM支持SPM

Ivan Rublev维护。



  • IvanRublev

PersistentStorageSerializable 是一个协议,用于将 Swift 类、结构体或 NSObject 子类对象自动序列化和反序列化到和从 User Defaults 或 Property List 文件。

采用该类型属性必须是属性列表类型(String、Data、Date、Int、UInt、Float、Double、Bool、Array 或以上类型的字典)。如果您想存储其他类型的对象,您通常需要将其存档以创建一个 Data 实例。URL 属性可以存储在 User Defaults 存储中,但不能存储在 Plist 存储中。在后一种情况下,您必须将它们存档到/从前面转换为 Data。

PersistentStorageSerializable 协议提供了 init(from:) 构造函数和 persist() 函数的默认实现。该库定义了两种 PersistentStorage 协议的类型:UserDefaultsStoragePlistStorage。将其中之一作为参数传递给 init(from:) 构造函数调用来指定要用于序列化/反序列化的存储。

PersistentStorageSerializable 协议的函数遍历采用类型对象,并通过 Reflection 库获取/设置其属性值。NSObject 类继承的属性值通过 KVC 获取/设置。

如何使用

使用以下示例通过 UserDefaultStorage 序列化和反序列化具有 User Defaults 的结构体

struct Settings: PersistentStorageSerializable {
    var flag = false
    var title = ""
    var number = 1
    var dictionary: [String : Any] = ["Number" : 1, "Distance" : 25.4, "Label" : "Hello"]

    // MARK: Adopt PersistentStorageSerializable
    var persistentStorage: PersistentStorage!
    var persistentStorageKeyPrefix: String! = "Settings"
}

// Init from User Defaults
let mySettings = Settings(from: UserDefaultsStorage.standard)

mySettings.flag = true

// Persist into User Defaults
mySettings.persist()

使用 PlistStorage 类将数据序列化到 Plist 文件中

// Init from plist
let plistUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last!.appendingPathComponent("storage.plist")

let settingsOnDisk = try! Settings(from: PlistStorage(at: plistUrl))

mySettings.flag = true

// Persist on disk
try! mySettings.persist()

读取应用程序的前一个版本存储的数据

当您以前版本的应用程序中持久化了一些数据,并希望将数据读取到一个结构体中时,您需要通过重载 persistentStorageKey(for:) 函数提供属性名称和 User Defaults 键之间的映射。

假设我们有以下数据已保存在 User Defaults 中

UserDefaults.standard.set("Superhero", forKey: "oldGoogTitle")
UserDefaults.standard.set(true, forKey: "well.persisted.option")

我们希望这些数据使用 ApplicationConfiguration 类的对象进行序列化。

final class ApplicationConfiguration: PersistentStorageSerializable {
    var title = ""
    var showIntro = false

    // MARK: Adopt PersistentStorageSerializable
    var persistentStorage: PersistentStorage!
    var persistentStorageKeyPrefix: String!
}

// Provide key mapping by overloading `persistentStorageKey(for:)` function.
extension ApplicationConfiguration {
    func persistentStorageKey(for propertyName: String) -> String {
        let keyMap = ["title" : "oldGoogTitle", "showIntro" : "well.persisted.option"]
        return keyMap[propertyName]!
    }
}

// Now we can load data persisted in the storage.
let configuration = try! ApplicationConfiguration(from: UserDefaultsStorage.standard)

print(configuration.title) // prints Superhero
print(configuration.showIntro) // prints true

示例

要在终端运行示例项目,请运行 pod try PersistentStorageSerializable

要求

  • Xcode 8.3
  • Swift 3.1

安装

PersistentStorageSerializable 可以通过 CocoaPods 获取。要安装它,只需将以下行添加到您的 Podfile 中

pod "PersistentStorageSerializable"

然后运行 pods updatepods install

作者

版权所有 (c) 2017, IvanRublev, [email protected]

许可

PersistentStorageSerializable 采用 MIT 许可。有关更多信息,请参阅 LICENSE 文件。