Хранилище значений универсального ключа со связанным типом

#swift

Вопрос:

Я хочу создать хранилище конфигураций ключей/значений для своего приложения.

Я пытаюсь придумать ConfigurationStore протокол, который позволяет мне устанавливать и получать значения конфигурации из центрального местоположения (в данном случае это может быть карта). Значения должны быть проверены на тип для определенного ключа. например: значение для timeInSeconds не может быть String

 // psuedocode
protocol ConfigurationStore {

    set(key: TypeCheckedKey, value: AssociatedValueForThatKey)

    get(key: TypeCheckedKey) -> AssociatedValueForThatKey?

}
 

Ключи и связанные с ними значения должны быть проверены на тип. например. Я не должен быть в состоянии вызвать set для одного и того же ключа с 2 разными типами значений. Возможно, потребуется какое-то сопоставление пары Ключ:тип значения.

Как бы я это сделал ? В настоящее время я хочу поддерживать Int Double и String настраивать значения

Я думал об использовании перечислений для ключей, но тогда я могу установить несколько типов значений для одного и того же ключа.

Все это должно быть общим, чтобы ключи и значения могли быть определены потребителем приложения.

Комментарии:

1. Покажите пример того, как вы бы использовали это, даже если оно не компилируется

Ответ №1:

Попробуйте это:

 protocol ConfigurationStore {
    associatedtype TypeCheckedKey
    associatedtype AssociatedValueWithTheKey

    func set(key: TypeCheckedKey, value: AssociatedValueWithTheKey)
    func get(key: TypeCheckedKey) -> AssocicatedValueWithTheyKey?    
}
 

UPD:

 final class SomeStore: ConfigurationStore {
    typealias TypeCheckedKey = String
    typealias AssociatedValueWithTheKey = String

    func set(key: TypeCheckedKey, value: AssociatedValueWithTheKey) {
        // your realisation
    }
    
    func get(key: TypeCheckedKey) -> AssocicatedValueWithTheyKey? {
        // your realisation
    }
}
 

Комментарии:

1. Как бы я сопоставил, какой ключ принадлежит какому типу значения ?

2. @user2416162 это должно быть вашей реализацией. протокол опишите свой интерфейс/абстракцию

3. Как сделать абстракцию достаточно универсальной, чтобы она знала, какой тип значений разрешен для ключа