迅速-UserDefaults包装器

时间:2018-10-11 10:33:53

标签: swift

我想使 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)
    }
}   

问题

  1. 是否可以删除“枚举allKeys”?

  2. 我应该使用 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))
    }
}

我收到错误消息“表达式类型不明确,没有更多上下文”

0 个答案:

没有答案