在PromiseKit 6中返回void
这就是我使用PromiseKit 4.5的原因
api.getUserFirstName().then { name -> Void in print(name) }
getUserFirstName()
返回Promsise
。 我更新到PromiseKit 6,现在抛出一个错误: Cannot convert value of type '(_) -> Void' to expected argument type '(_) -> _'
此错误消息对我来说没什么意义。 我该如何解决?
编辑:所以这似乎解决了它,但我对这发生了什么没有什么了解:
api.getUserFirstName().compactMap { name in print(name) }
那么then()
和compactMap()
之间有什么区别?
根据PromiseKit 6.0指南, then
被拆分为then
, done
和map
-
then
输入先前的承诺值并要求您返回承诺。 -
done
前一个承诺值并返回一个Void承诺(这是链使用的80%) -
map
是前一个promise值,需要你返回一个非promise,即。 一个值。
为什么会这样? 正如开发者所说:
使用PromiseKit,我们做了很多事情,我们依靠Swift从上下文中推断出正确的。 然而,如果使用多行,
then
无法执行此操作,而不是告诉您情况不明确,它会发明一些其他错误。 通常,可怕的cannot convert T to AnyPromise
。 我们有一个故障排除指南来解决这个问题,但我相信只有工作的工具,当你花了4年时间等待Swift解决问题而Swift没有解决问题时,你会怎么做? 我们选择在更高层次上找到解决方案。
所以可能在你的情况下需要使用done
func stackOverflowExample() { self.getUserFirstName().done { name -> Void in print(name) } } func getUserFirstName() -> Promise { 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` }
在发布指南中查看更多信息
compactMap
被重命名为flatMap
请参阅此处的讨论