2017-06-10 1 views
0

J'essaie d'observer mon UserDefaults pour surveiller les changements à locations, qui est un tableau de CLLocationCoordinate2D.RxSwift: observer un tableau stocké dans UserDefaults

Voici ce que je suis en train:

extension UserDefaults { 

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

} 

Mais je reçois cette erreur:

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

Toutes les idées? Merci!

Répondre

1

observe retourne un Observable d'un élément facultatif: Observable<[CLLocationCoordinate2D]?>

Ce n'est pas une très bonne erreur. Il aurait été plus utile si elle avait dit quel type était en vous voyant essayer de revenir, au lieu de juste ce qu'il attendait.

Une façon de voir cela est de créer une variable, puis de la retourner à la place.

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

Vous auriez pu voir quel type a est (Observable<[CLLocationCoordinate2D]?>), et aurait également obtenu un meilleur message d'erreur:

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

Donc, corriger cette erreur, votre code devrait ressembler à ceci:

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

Bien que je suggère que vous ne comptez pas sur l'inférence de type et plutôt être de type explicite au sujet de l'élément du tableau. Swift a déjà assez de temps:

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