【问题标题】:RxSwift: observe an array stored in UserDefaultsRxSwift:观察存储在 UserDefaults 中的数组
【发布时间】:2017-06-10 13:55:18
【问题描述】:

我正在尝试观察我的UserDefaults 以监控locations 的变化,这是CLLocationCoordinate2D 的数组。

这是我正在尝试的:

extension UserDefaults {

    var ob: Observable<[CLLocationCoordinate2D]> {
        return self.rx.observe(Array.self, "locations")
    }

}

但我收到此错误:

no 'observe' candidates produce the expected contextual result type 'Observable<[CLLocationCoordinate2D]>' (aka 'Observable<Array<CLLocationCoordinate2D>>

有什么想法吗?谢谢!

【问题讨论】:

    标签: arrays swift nsuserdefaults rx-swift


    【解决方案1】:

    observe 将返回可选元素的ObservableObservable&lt;[CLLocationCoordinate2D]?&gt;

    这不是一个很好的错误。如果它能够说明它正在看到你试图返回的类型,而不是它所期望的类型,那将会更有帮助。

    您可以看到这一点的一种方法是创建一个变量,然后将其返回。

    var ob: Observable<[CLLocationCoordinate2D]> {
        let a = self.rx.observe(Array<CLLocationCoordinate2D>.self, "locations")
        return a
    }
    

    您将能够看到 a 是什么类型 (Observable&lt;[CLLocationCoordinate2D]?&gt;),并且还会收到更好的错误消息:

    Cannot convert return expression of type 'Observable<[CLLocationCoordinate2D]?>' (aka 'Observable<Optional<Array<CLLocationCoordinate2D>>>') to return type 'Observable<[CLLocationCoordinate2D]>' (aka 'Observable<Array<CLLocationCoordinate2D>>')
    

    因此,纠正这个错误,您的代码应该如下所示:

    var ob: Observable<[CLLocationCoordinate2D]?> {
        return self.rx.observe(Array.self, "locations")
    }
    

    虽然我建议您不要依赖类型推断,而是明确说明数组的元素类型。斯威夫特的日子已经够艰难了:

    var ob: Observable<[CLLocationCoordinate2D]?> {
        return self.rx.observe(Array<CLLocationCoordinate2D>.self, "locations")
    }
    

    【讨论】:

    • 似乎对我不起作用。我可以rx.observe 非数组类型。我可以只使用array:forKey 来获取Array 类型的值,但我不能rx.observe 使用Array 类型。总是返回nil(并且键的值肯定在那里,因为它是由array:forKey返回的)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 2016-06-16
    • 2017-11-15
    • 1970-01-01
    • 2017-01-30
    相关资源
    最近更新 更多