我想使 userDefaults易于使用。我写这段代码。 但是我不想创建allKeys枚举(例voipToken,userId,userName,displayName等)作为我的属性的键路径。 如果要添加一个var accessToken来构造LoginInfo结构,则必须将一个case accessToken添加到枚举AllKeys中。我使用CoreStore.key(.accessToken)获得CoreStore.LoginInfo.accessToken的keyPath。
import Foundation
struct CoreStore {
// static let sharedInstance = CoreStore()
// private init(){}
private static let keyPrefix = "_shared_store_"
enum allKeys: String {
case accessToken
}
static func key(_ key: allKeys) -> String {
return keyPrefix + key.rawValue
}
struct LoginInfo: CoreStoreSettable,CoreStoreGettable { }
}
extension CoreStore.LoginInfo {
static var accessToken: String? {
set {
set(value: newValue, forKey: CoreStore.key(.accessToken))
}
get {
return getString(forKey: CoreStore.key(.accessToken))
}
}
// ...
}
protocol CoreStoreSettable {}
extension CoreStoreSettable {
static func set(value: String?, forKey key: String) {
UserDefaults.standard.set(value, forKey: key)
}
}
protocol CoreStoreGettable {}
extension CoreStoreGettable {
static func getString(forKey key: String) -> String? {
return UserDefaults.standard.string(forKey: key)
}
}
问题:
是否可以删除“枚举allKeys”?
我应该使用 sharedInstance 吗? 为什么?
我尝试了:
static var accessToken: String? {
set {
let keyPath = \CoreStore.Loginfo.accessToken
let keyPathString = keyPath.string
set(value: newValue, forKey: keyPathString)
}
get {
return getString(forKey: CoreStore.key(.accessToken))
}
}
我收到错误消息“表达式类型不明确,没有更多上下文”