ReactiveKit Bond KVO观察UserDefaults

时间:2017-06-13 20:49:02

标签: swift userdefaults reactivekit swiftbond

我之前使用的是RxSwift,我决定不再使用它,并且能够将所有内容转换为我更熟悉的Bond。由于新版本更改为Bond v5,我似乎无法弄清楚如何在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

1 个答案:

答案 0 :(得分:3)

可能不是很明显,但如果观察到的值可以为nil,则ofType参数必须是Optional类型。在你的情况下,那将是:

userDefaults.reactive
    .keyPath(LocationManager.HomeLocationKey, ofType: Optional<String>.self, context: .immediateOnMain)
    ...