RxSwift:观察存储在UserDefaults中的数组

时间:2017-06-10 13:55:19

标签: arrays swift nsuserdefaults rx-swift

我正在尝试观察我的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>>

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

observe将返回Observable可选元素:Observable<[CLLocationCoordinate2D]?>

这不是一个非常好的错误。如果它已经说出 看到你试图返回的类型,而不仅仅是它所期望的类型,那会更有帮助。

你可以看到的一种方法是创建一个变量然后返回它。

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

您可以查看a的类型(Observable<[CLLocationCoordinate2D]?>),并且还会收到更好的错误消息:

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")
}