tl;dr
你喜欢 Swift 的 Codable 协议并在所有地方使用它,谁不喜欢呢!这里有一个简单且非常轻盈的方式,用几行代码将 Codable
对象存储和检索到各种持久化层!
持久化层
PersistenceKit 提供了 3 层持久化,适合大多数用例
1. UserDefaults
- 使用
UserDefaults
存储数据。 - 适用于存储合理数量的对象。
2. 文件
- 使用
FileManager
将数据直接存储到应用的文档目录中的文件夹。 - 适用于存储大量对象。
3. 密钥链
- 使用《
Security框架
》将数据存储到操作系统的密钥链中。 - 适合存储敏感数据,如访问令牌。
什么是v1.3的新特性?
1.3版支持Swift 5.0。
安装
通过CocoaPods
要使用CocoaPods将PersistenceKit整合进您的Xcode项目,请在您的Podfile
中指定它。
pod 'PersistenceKit'
Carthage
要使用Carthage将PersistenceKit整合进您的Xcode项目,请在您的Cartfile
中指定它。
github "Teknasyon-Teknoloji/PersistenceKit"
Swift包管理器
您可以使用Swift包管理器通过在您的Package.swift
文件中添加适当的描述来安装PersistenceKit
。
import PackageDescription
let package = Package(
name: "YOUR_PROJECT_NAME",
targets: [],
dependencies: [
.package(url: "https://github.com/Teknasyon-Teknoloji/PersistenceKit.git", from: "0.1")
]
)
用法
假设您有两个结构体:以下定义的User
和Laptop
。
struct User: Codable {
var id: Int
var firstName: String
var lastName: String
var laptop: Laptop?
}
struct Laptop: Codable {
var model: String
var name: String
}
Identifiable协议
并设置idKey属性
1. 遵守Identifiable协议
让PersistenceKit知道每个对象的唯一ID是什么。
struct User: Codable, Identifiable {
static let idKey = \User.id
...
}
struct Laptop: Codable, Identifiable {
static let idKey = \Laptop.model
...
}
留意到
User
使用Int
作为它的 id,而Laptop
使用String
,实际上 id 可以是任何类型。PersistenceKit 使用 Swift 的 keypath 来引用属性而不实际调用它们。Swift 真棒🤘
2 创建数据存储
// To save objects to UserDefaults, create UserDefaultsStore:
let usersStore = UserDefaultsStore<User>(uniqueIdentifier: "users")!
let laptopsStore = UserDefaultsStore<Laptop>(uniqueIdentifier: "laptops")!
// To save a single object to UserDefaults, create UserDefaultsStore:
let userStore = SingleUserDefaultsStore<User>(uniqueIdentifier: "user")!
// To save objects to the file system, create FilesStore:
let usersStore = FilesStore<User>(uniqueIdentifier: "users")
let laptopsStore = FilesStore<Laptop>(uniqueIdentifier: "laptops")
// To save a single object to the file system, create SingleFilesStore:
let userStore = SingleFilesStore<User>(uniqueIdentifier: "user")
// To save a single object to the system's keychain, create SingleKeychainStore:
let userStore = SingleKeychainStore<User>(uniqueIdentifier: "user")
3. 哇!一切准备就绪!
let macbook = Laptop(model: "A1278", name: "MacBook Pro")
let john = User(userId: 1, firstName: "John", lastName: "Appleseed", laptop: macbook)
// Save an object to a store
try! usersStore.save(john)
// Save an array of objects to a store
try! usersStore.save([jane, steve, jessica])
// Get an object from store
let user = store.object(withId: 1)
let laptop = store.object(withId: "A1278")
// Get all objects in a store
let laptops = laptopsStore.allObjects()
// Check if store has an object
print(usersStore.hasObject(withId: 10)) // false
// Iterate over all objects in a store
laptopsStore.forEach { laptop in
print(laptop.name)
}
// Delete an object from a store
usersStore.delete(withId: 1)
// Delete all objects in a store
laptops.deleteAll()
// Know how many objects are stored in a store
let usersCount = usersStore.objectsCount
要求
- iOS 8.0+ / macOS 10.10+ / tvOS 9.0+ / watchOS 2.0+
- Xcode 10.0+
- Swift 4.2+
感谢
特别感谢:
- Paul Hudson 的关于如何使用 Swift keypath 来编写更自然代码的 文章。
版权
- 图标 由 freepik 创建于 flaticon.com。
许可证
PersistenceKit 在 MIT 许可证下发布。更多信息请见 LICENSE。