У меня простой класс:
class Values<T> {
let new: T
let old: T?
init(new: T, old: T? = nil) {
self.new = new
self.old = old
}
func changed<TProp: AnyObject>(_ getter: (T) -> TProp) -> Bool {
return old == nil || !(getter(old!) === getter(new))
}
func changed<TProp: Equatable>(_ getter: (T) -> TProp) -> Bool {
return old == nil || !(getter(old!) == getter(new))
}
}
При использовании его в качестве Values<ChartViewModelData?>
, где ChartViewModelData - это класс, у меня возникают проблемы, когда старый является вложенным, необязательным - он равен нулю и не равен нулю:

Так что изменение такой функции не поможет:
return old == nil || old! == nil || !(getter(old!) === getter(new))
ноль не следует передавать в функцию получения, и я не знаю, как этого добиться.
Воспроизводить:
class PropClass {}
class TestClass {
var someProp = PropClass()
}
let values = Values<TestClass?>(new: TestClass(), old: Optional<Optional<TestClass>>(nil))
values.changed({ $0!.someProp }) /* Fatal error: Unexpectedly found nil while unwrapping an Optional value */
values.changed({ $0?.someProp }) /* error: cannot convert value of type '(TestClass?) -> PropClass?' to expected argument type '(TestClass?) -> _' */
Появляется вторая ошибка, поскольку она не может использовать === для двух необязательных.