For example:
struct Foo {
typealias WritableKeyPath<Value> = Swift.WritableKeyPath<Foo, Value>
var optional: Int?
var nonOptional: Int = 0
mutating func set<Value>(keyPath: WritableKeyPath<Value>, value: Value) {
self[keyPath: keyPath] = value
}
mutating func set<Value>(keyPath: WritableKeyPath<Value?>, value: Value?, onNilOnly: Bool) {
if self[keyPath: keyPath] == nil || onNilOnly == false {
self[keyPath: keyPath] = value
}
}
}
var foo = Foo()
foo.set(keyPath: \.nonOptional, value: 1) /// foo.nonOptional: 0 -> 1
foo.set(keyPath: \.optional, value: 10, onNilOnly: true) /// foo.optional: nil -> Optional(10)
foo.set(keyPath: \.optional, value: 100, onNilOnly: true) /// foo.optional: Optional(10) <- Does not change
foo.set(keyPath: \.optional, value: 100, onNilOnly: false) /// foo.optional: Optional(10) -> Optional(100)
/// I don't want follwing code to be compiled:
foo.set(keyPath: \.optional, value: 1000) /// foo.optional: Optional(100) -> Optional(1000)
What I want to achieve is, when setting an optional key path, the parameter onNilOnly
must be passed in explicitly.
So apart from changing the function name for the Optional
one, is there a way to require the first function's generic type to be Non-Optional? Something like:
mutating func set<Value>(keyPath: WritableKeyPath<Value>, value: Value) where Value != Optional { ... }
or
mutating func set<Value?>(keyPath: WritableKeyPath<Value>, value: Value)
or
mutating func set<Optional<Value>>(keyPath: WritableKeyPath<Value>, value: Value)