I figured out the extension I wanted.
extension Dictionary { subscript(key: Keys) -> Value? { get { return self[String(key) as! Key] } set(value) { guard let value = value else { self.removeValueForKey(String(key) as! Key) return } self.updateValue(value, forKey: String(key) as! Key) } } } enum Keys { case key_one case key_two } var myStringDict = [String : String]()
Note that the declared dictionary type of the word is String
, but I can just use Keys.key_one
, and the index in the dictionary extension will take care of the rest.
Maybe Iād better work on transforming as!
in Key
, but I'm not sure if this is necessary, since I know that my enum can always be converted to a valid Key
using String()
casting.
Better response
Even better, since I use this for API keys, I made an empty protocol called APIKeys
, and each model will implement its own list of Keys
, which conforms to the APIKeys
protocol. And the dictionary index is updated to accept APIKeys
as the value of Key
.
extension Dictionary { subscript(key: APIKeys) -> Value? { get { return self[String(key) as! Key] } set(value) { guard let value = value else { self.removeValueForKey(String(key) as! Key) return } self.updateValue(value, forKey: String(key) as! Key) } } } protocol APIKeys {} enum Keys: APIKeys { case key_one case key_two } enum Model1Keys: APIKeys { case model_1_key_one case model_1_key_two } enum Model2Keys: APIKeys { case model_2_key_one case model_2_key_two } var myStringDict = [String : String]() var model1StringDict = [String : String]() var model2StringDict = [String : String]() myStringDict.updateValue("firstValue", forKey: String(Keys.key_one)) // myStringDict: ["key_one": "firstValue"] myStringDict[Keys.key_two] = "secondValue" // myStringDict: ["key_one": "firstValue", "key_two": "secondValue"] myStringDict[Keys.key_one] = nil // myStringDict: ["key_two": "secondValue"] model1StringDict.updateValue("firstValue", forKey: String(Model1Keys.model_1_key_one)) // model1StringDict: ["model_1_key_one": "firstValue"] model1StringDict[Model1Keys.model_1_key_two] = "secondValue" // model1StringDict: ["model_1_key_one": "firstValue", "model_1_key_two": "secondValue"] model1StringDict[Model1Keys.model_1_key_one] = nil // model1StringDict: ["model_1_key_two": "secondValue"] model2StringDict.updateValue("firstValue", forKey: String(Model2Keys.model_2_key_one)) // model2StringDict: ["model_2_key_one": "firstValue"] model2StringDict[Model2Keys.model_2_key_two] = "secondValue" // model2StringDict: ["model_2_key_one": "firstValue", "model_2_key_two": "secondValue"] model2StringDict[Model2Keys.model_2_key_one] = nil // model2StringDict: ["model_2_key_two": "secondValue"]
source share