【问题标题】:How to check if nested optional is nil in generic class?如何检查泛型类中嵌套的可选项是否为零?
【发布时间】: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&lt;ChartViewModelData?&gt; 其中 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?) -&gt; Bool类型的==重载,其中X的运行时类型是T?,这使得运算符实际上类型为(T??, T??) -&gt; Bool,比较的是Optional.some(Optional.none)Optional.none,它们不等价。

标签: swift generics optional


【解决方案1】:

花了几个小时寻找类似问题的解决方案,我想我终于找到了。要检查泛型类型的嵌套值是否为 nil,您可以使用:

if (newValue as AnyObject) is NSNull { 
    //value is nil
}

【讨论】:

    猜你喜欢
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    相关资源
    最近更新 更多