Storage
所有类型的存储
- 都具有相同的接口。
- 可扩展。
- 线程安全。
接口
通过管理器提供的任何存储都可以作为键值对访问。您可以使用字符串,但您将收到警告,因为已经弃用了这种方法。框架原生建议使用基于字符串的枚举。
在示例中,我将使用以下内容
enum Auth: String {
case username // .rawValue == "username"
case isAdmin // .rawValue == "isAdmin"
}
可用的管理器:
-
钥匙串
快捷方式:KC
-
UserDefaults
快捷方式:UD
-
Cache
[临时 / 持久]快捷方式:CH
您可以通过编写实现并订阅到 StorageManagerProtocol
来轻松扩展可用的管理器。
您应通过提供者访问任何存储。您可以使用它们作为静态或单例属性。
[Manager].[Provider]
开箱即用的 提供者:
.data
.bool
.string
提供者 允许您通过以下方式访问存储
- 通过下标
provider[key]
- 通过方法
provider.get(for: key)
provider.set(value, for: key)
- 通过已弃用的下标和方法
provider[stringKey]
provider.get(forKey: stringKey)
provider.set(value, forKey: stringKey)
为了方便起见,您可以将自定义适配器下标扩展到框架的 Storage.Provider
extension Storage.Provider {
subscript(key: Auth) -> Value? { // Value is a Provider's assosiated type.
get { get(for: key) } // Just pass key to build-in getter,
set { set(newValue, for: key) } // or key-value to build in setter.
}
}
这将允许您不仅像这样访问存储:
Storage.[Manager].[Provider][Auth.username]
还可以像这样:
Storage.[Manager].[Provider][.username]
以钥匙串为例
Storage.Keychain.data.set(nil, forKey: "deletedItem")
Storage.Keychain.data.get(forKey: "deletedItem") // nil
Storage.Keychain.data["StringKeys"] = "Sucks c:".data(using: .utf8)
Storage.Keychain.default.string[.username] = "Root"
存储.密钥链默认布尔值[.isAdmin] = true
存储.KC布尔值[.isAdmin] // true