tl;dr
您喜欢 Swift 的 Codable
协议,并处处使用它,谁不喜欢呢!这里有一个简单而轻量级的方式,只用几行代码就能存储和检索 —— 一定数量的 Codable
对象!
介绍 v2.0
- 替换了 Swift 的
Identifiable
协议。 - 提高了部署目标到 iOS
13.0
,tvOS 13.0
,macOS 10.15
和watchOS 6.0
。 - 现在可以定义非 final 类的对象。
- 添加了新的
generateSnapshot()
和restoreSnapshot(_:)
方法,用于生成和恢复Snapshot
对象,该对象可以保存(例如,到 iCloud)并在以后恢复。 - 修复了可能导致
objectsCount
与存储中对象的实际数量不同步的错误。
安装
Swift 包管理器(推荐)
您可以使用 Swift 包管理器 通过将适当的描述添加到您的 Package.swift
文件来安装 UserDefaultsStore
。
import PackageDescription
let package = Package(
name: "YOUR_PROJECT_NAME",
targets: [],
dependencies: [
.package(url: "https://github.com/omaralbeik/UserDefaultsStore.git", from: "2.0.0")
]
)
接下来,将 UserDefaultsStore
添加到您的目标的依赖项中,例如
.target(
name: "YOUR_TARGET_NAME",
dependencies: [
"UserDefaultsStore",
]
),
然后运行 swift package update
。
CocoaPods
要使用 CocoaPods 将 UserDefaultsStore 集成到您的 Xcode 项目中,请在您的 Podfile
中指定它。
pod 'UserDefaultsStore'
Carthage
要使用 Carthage 将 UserDefaultsStore 集成到您的 Xcode 项目中,请在您的 Cartfile
中指定它
github "omaralbeik/UserDefaultsStore" ~> 2.0.0
使用方法
假设您定义了两个结构体 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
}
以下是使用 UserDefaultsStore 存储它们的方式:
Identifiable
协议并设置 id
属性
1. 遵守 Identifiable
协议让 UserDefaultsStore 能够知道每个对象的唯一 id。
struct User: Codable, Identifiable {
...
}
struct Laptop: Codable, Identifiable {
var id: String { model }
...
}
2. 创建 UserDefaults Stores
let usersStore = UserDefaultsStore<User>(uniqueIdentifier: "users")
let laptopsStore = UserDefaultsStore<Laptop>(uniqueIdentifier: "laptops")
好了,一切设置完毕!
let macbook = Laptop(model: "A1278", name: "MacBook Pro")
let john = User(id: 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
// Create a snapshot
let snapshot = usersStore.generateSnapshot()
// Restore a pre-generated snapshot
try? usersStore.restoreSnapshot(snapshot)
只想存储单个项目吗?
使用 SingleUserDefaultsStore
,它允许存储和检索单个 Int
、Double
、String
或任何 Codable
类型。
需求
- iOS 13.0+ / macOS 10.15+ / tvOS 13.0+ / watchOS 6.0+
- Swift 5.0+
致谢
特别感谢
- Paul Hudson为他关于如何使用Swift keypaths编写更自然代码的文章。
- Batuhan Saka将该文档翻译成土耳其语。
鸣谢
图标由freepik在flaticon.com上创建。
许可
UserDefaultsStore是在MIT许可证下发布的。更多信息请参阅LICENSE。