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

问题描述:

我试图观察我的UserDefaults以监视对locations的更改,它是CLLocationCoordinate2D的数组。RxSwift:观察存储在UserDefaults中的数组

这里就是我想:

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>> 

任何想法?谢谢!

observe将返回一个可选元素的ObservableObservable<[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") 
}