2017-06-10 4 views
0

Ich versuche zu beobachten UserDefaults zu Änderungen an locations, die ein Array von CLLocationCoordinate2D ist.RxSwift: beobachten Sie ein Array in UserDefaults gespeichert

Hier ist, was ich versuche:

extension UserDefaults { 

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

} 

Aber ich bekomme diese Fehlermeldung:

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

Irgendwelche Ideen? Vielen Dank!

Antwort

1

observe wird eine Observable ein optionales Element zurück: Observable<[CLLocationCoordinate2D]?>

Es ist kein sehr guter Fehler. Es wäre hilfreicher gewesen, wenn es gesagt hätte, was für ein Typ war, als er sah, dass du versuchst zurückzukehren, anstatt genau das, was er erwartet hatte.

Eine Möglichkeit, die Sie gesehen haben könnten, besteht darin, eine Variable zu erstellen und diese stattdessen zurückzugeben.

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

Sie wäre in der Lage zu sehen, welche Art a ist (Observable<[CLLocationCoordinate2D]?>) und hätte auch eine bessere Fehlermeldung bekommen:

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

Also, diesen Fehler zu korrigieren, sollte Ihr Code aussehen dies:

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

Obwohl ich würde vorschlagen, Sie verlassen sich nicht auf Typinferenz und stattdessen sein explizit über den Elementtyp des Arrays. Swift hat eine harte Zeit, wie es ist:

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