【发布时间】:2021-08-06 22:24:19
【问题描述】:
我有简单的课程:
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 是一个类时,当 old 嵌套可选时我遇到问题 - 它既是 nil 也不等于 nil:
所以像这样改变函数没有帮助:
return old == nil || old! == nil || !(getter(old!) === getter(new))
nil不应该传给getter函数,我也不知道怎么实现。
转载:
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?) -> _' */
出现第二个错误是因为它不能在两个 Optional 上使用 ===。
【问题讨论】:
-
getter到底是做什么的? -
@Alexander 返回对象的某些属性,如果与旧值相比,如果更改为新值,则更改函数返回。
-
你能给我们一些测试用例吗?
-
if values.changed({ $0!.chart }) { // 处理图表变化 }
-
我认为在
old! == nil代码中,调用的是(X?, X?) -> Bool类型的==重载,其中X的运行时类型是T?,这使得运算符实际上类型为(T??, T??) -> Bool,比较的是Optional.some(Optional.none)和Optional.none,它们不等价。