【问题标题】:Returning void in PromiseKit 6在 PromiseKit 6 中返回 void
【发布时间】:2018-08-15 06:31:34
【问题描述】:

这就是我使用 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() 现在有什么区别?

【问题讨论】:

标签: ios swift promise promisekit


【解决方案1】:

根据PromiseKit 6.0 Guidethen被拆分为thendonemap

  • then 接受了之前的承诺值,并要求您返回一个承诺。
  • done被提供了之前的承诺值并返回一个 Void 承诺(这是链使用的 80%)
  • map 提供了先前的承诺值,并要求您返回非承诺,即。一个值。

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

使用 PromiseKit,我们的 then 做了很多事情,我们依靠 Swift 从上下文中推断出正确的 then。但是,如果使用多行thens,它将无法做到这一点,并且不会告诉您情况模棱两可,而是会发明一些其他错误。通常是可怕的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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多