sindresorhus / Defaults

💾 Swifty and modern UserDefaults
https://swiftpackageindex.com/sindresorhus/Defaults/documentation/defaults
MIT License
2k stars 120 forks source link

Setting optional values to nil doesn't work #119

Open pejrich opened 1 year ago

pejrich commented 1 year ago
extension Defaults.Keys {
  static let foo = Key<Int?>("foo", default: 1)
}

Here I have some option that defaults to 1, but is optional.

Defaults[.foo] // => 1
Defaults[.foo] = 2
Defaults[.foo] // => 2
Defaults[.foo] = nil
Defaults[.foo] // => 1

Why would explicitly setting an optional to nil make it reset to the default? Isn't that what reset() is for? Logically it would make sense to have an option that has a default value, but can also be turned off.

I tried with an Enum:

enum OptionalKey: Defaults.Serializable {
  case some(Int)
  case none
}

But this fails as it doesn't conform to Defaults.Serializable.

Is there no way to have both a default key, but also retain the ability to set it to nil?

sindresorhus commented 1 year ago

The default parameter isn't meant for optionals. The problem is that I haven't found a good way to prevent it being available for optionals.

The correct solution here is to add an initialValue parameter: https://github.com/sindresorhus/Defaults/issues/54