Я хочу сделать userDefaults проще в использовании .Я пишу этот код.Но я не хочу создавать перечисление allKeys (случаи voipToken, userId, userName, displayName, ...) в качестве ключевого пути для моего свойства.Если я хочу добавить переменную accessToken в структуру LoginInfo, я должен добавить case accessToken для перечисления AllKeys.Я использую CoreStore.key (.accessToken), чтобы получить keyPath для CoreStore.LoginInfo.accessToken.
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)
}
}
Вопросы :
Есть ли способ удалить"enum 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))
}
}
Я получаю ошибку "Тип выражения неоднозначен без контекста«