2017-06-13 2 views
2

以前はRxSwiftを使用していましたが、私はもう使用したくないと判断し、すべてをBondに変換することができました。 Bond v5に新しい変更が加えられたので、私はUserDefaultsの値をどのように観察するのか分からないようです。次のコードは私に致命的なエラーを与えてしまいます。ReactiveKit Bond KVO observe UserDefaults

userDefaults.reactive 
     .keyPath(LocationManager.HomeLocationKey, ofType: String.self, context: .immediateOnMain) 
     .map(self.initLocation(from:)) 
     .bind(to: self.homeLocation) 

userDefaults UserDefaults.standardへの参照であるとLocationManager.HomeLocationKey文字列です。私はそれが尋ねられることを知っているので私はinitLocation機能を以下に提供しています。その機能の下で、私は、アプリケーションの起動後に受信しているエラーを投稿します。

func initLocation(from string: String?) -> Location? 
    { 
    guard let dataString = string 
     else { log.warning("Location data did not exist, returning nil"); return nil } 

    let json = JSON.parse(dataString) 

    return Location(from: json) 
    } 

エラー:

fatal error: Could not convert nil to String. Maybe `dynamic(keyPath:ofExpectedType:)` method might be of help?): file /Users/sam/Documents/iOS Apps/Drizzle/Pods/Bond/Sources/Shared/NSObject+KVO.swift, line 58 
+0

Typeを 'Optional .self、'に設定すると機能しますか? –

+0

これは完璧に機能しました。私が正しいタイプを入れれば、確かに助けになるでしょう。自由にそれに答えると私は受け入れます:) – SamG

+0

それはうまくいった! :) –

答えて

2

それは明白ではないかもしれませんが、観測値がnilすることができた場合、ofType引数はオプションのタイプでなければなりません。あなたの場合、それは次のようになります:

userDefaults.reactive 
    .keyPath(LocationManager.HomeLocationKey, ofType: Optional<String>.self, context: .immediateOnMain) 
    ... 
関連する問題