我正在尝试观察我的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>>
有什么想法吗?谢谢!
答案 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")
}