enum Settings: Int { case Suffix case SignificantDigits case Count func toString() -> String { switch(self) { case .Suffix: return "Suffix" case .SignificantDigits: return "SignificantDigits" default: return String(self.toRaw()) } } func defaultValue() -> AnyObject { switch(self) { case .Suffix: return "mm" case .SignificantDigits: return 2 default: return String(self.toRaw()) } } } class SettingsManager { init() { self[Settings.Suffix] = Settings.Suffix.defaultValue() self[Settings.SignificantDigits] = Settings.Suffix.defaultValue() } subscript(setting: Settings) -> AnyObject { get { return _storage[setting]! } set(newValue) { _storage[setting] = newValue } } func save() { let defaults = NSUserDefaults.standardUserDefaults() for (key, value: AnyObject) in _storage { defaults.setObject(value, forKey: key.toString()) } defaults.synchronize() } func load() { let defaults = NSUserDefaults.standardUserDefaults() for i in 0..Settings.Count.toRaw() { if let setting = Settings.fromRaw(i) { _storage[setting] = defaults.objectForKey(setting.toString()) } } } var _storage = Dictionary() } var settingsManager = SettingsManager() settingsManager[Settings.Suffix] = "km"