StorageKit

用于从任何类型的存储中保存和检索数据的 Swift 库。

Defaults

UserDefaults 的封装,允许您存储和检索 Codable 对象。

import FoundationKit
struct User: Codable {
    let name: String
    let email: String
    let age: Int
}

final class UserViewModel {
    @Defaults("user", defaultValue: nil)
    var user: User? {
        didSet {
            print("new user: \(user)")
        }
    }
}

UserDefaultsStorage

一个提供从 UserDefaults 保存和检索数据的方法的存储。

let storage = UserDefaultsStorage<Int?>(key: "MyKey")
storage.value = 1

FileStorage

一个提供从文件系统保存和检索数据的方法的存储。 它使用 FileManager 与文件系统交互。 默认路径掩码为:./userDomainMask/cachesDirectory/Storages/fileName.stg

let storage = FileStorage<Int>(fileName: "TestFile.txt")
storage.value = 1

InMemoryStorage

一个提供在内存中保存和检索数据的方法的存储。

let storage = InMemoryStorage<Int>(value: 1)
storage.value = 1

KeychainStorage

一个提供从 OS Keychain 保存和检索数据的方法的存储。 最安全的存储,但受 SDK 的限制。

let storage = KeychainStorage(key: "MyKey", configuration: .init(service: Bundle.main.bundleIdentifier ?? "MyService")
storage.value = auth.token

AnyStorage

类型擦除的存储,提供从任何类型的存储中保存和检索数据的方法。 每个存储都有一个 toAny() 方法,用于将特定存储转换为 AnyStorage

let storage = UserDefaultsStorage<Int?>(key: "MyKey").toAny()
storage.value = 1

Composition

AnyStorage<Value> 符合 Storage 协议,可以通过 combine() 方法或全局函数 zip(storages:) 与其他存储组合使用。

let userDefaultsStorage = UserDefaultsStorage<Int?>(value: 1)
let inMemoryStorage = InMemoryStorage<Int>(value: 1)

let combined = inMemoryStorage.combine(userDefaultsStorage) // AnyStorage<Int>
combined.value = 1

zip<Value>(storages: [any Storage<Value>]) 仅在 iOS 16 或更高版本中可用

let combined = zip(storages: [
    InMemoryStorage<Int?>(value: 1),
    UserDefaultsStorage(key: "MyKey")
])

zip<Value>(storages: [AnyStorage<Value>]) 在 iOS 16 或更高版本中已被弃用

let combined = zip(storages: [
    InMemoryStorage<Int?>(value: 1).toAny(),
    UserDefaultsStorage(key: "MyKey").toAny()
])

Expirable

属性包装器,允许您为该值设置过期时间。

@Expirable(lifetime: .oneHour) var token: String?