在PromiseKit 6

时间:2018-03-07 08:19:31

标签: ios swift promise promisekit

这是我使用PromiseKit 4.5

的原因
api.getUserFirstName().then { name -> Void in
  print(name)
}

getUserFirstName()返回Promsise<String>。我更新到PromiseKit 6,现在抛出一个错误: Cannot convert value of type '(_) -> Void' to expected argument type '(_) -> _'

此错误消息对我来说没什么意义。我该如何解决这个问题?

编辑:所以这似乎解决了这个问题,但我对此发生的事情几乎一无所知:

api.getUserFirstName().compactMap { name in
  print(name)
}

then()compactMap()之间有什么区别?

1 个答案:

答案 0 :(得分:6)

根据PromiseKit 6.0 Guide then,被分为thendonemap

  • then已提供先前的承诺值,并要求您返回承诺。
  • done被提供前一个承诺值并返回一个Void承诺(占链使用量的80%)
  • map被提供前一个承诺值并要求您返回一个非承诺,即。价值。

为什么会这样?正如开发人员所说:

  

使用PromiseKit我们的then做了很多事情,我们依靠Swift从上下文中推断出正确的then。但是如果使用多行then,它将无法执行此操作,而不是告诉您情况不明确,它会发明一些其他错误。经常是可怕的cannot convert T to AnyPromise。我们有一个故障排除指南来解决这个问题,但我相信工具只是工作,当你花了4年时间等待Swift解决问题而Swift没有解决问题时,你会怎么做?我们选择在更高层次上找到解决方案。

因此,您可能需要使用done

func stackOverflowExample() {
    self.getUserFirstName().done { name -> Void in
        print(name)
    }
}

func getUserFirstName() -> Promise<String> {
    return .value("My User")
}

compactMap可让您在返回nil时获得错误传输。

firstly {
    URLSession.shared.dataTask(.promise, with: url)
}.compactMap {
    try JSONDecoder().decode(Foo.self, with: $0.data)
}.done {
    //…
}.catch {
    // though probably you should return without the `catch`
}

release guide

查看更多信息

compactMap已重命名为flatMap see discussions here