Swift 使用PromiseKit时使用recover error不明确

Swift 使用PromiseKit时使用recover error不明确,swift,promisekit,Swift,Promisekit,在处理执行承诺时可能引发的错误时,使用recover时遇到奇怪的错误 如果recover块中有多条语句,则Chaining.recover with.then将导致编译 在recover块中使用单个语句,并且单独使用recover(promise.recover{}而不使用then) 附加单语句recover(有效)和多语句recover(引发编译错误)的屏幕截图,并显示以下消息:recover的用法不明确(on:u uo:) 如果您有任何关于如何调试的帮助,我们将不胜感激。 recover可

在处理执行承诺时可能引发的错误时,使用recover时遇到奇怪的错误

如果recover块中有多条语句,则Chaining.recover with.then将导致编译

在recover块中使用单个语句,并且单独使用recover(promise.recover{}而不使用then)

附加单语句recover(有效)和多语句recover(引发编译错误)的屏幕截图,并显示以下消息:recover的用法不明确(on:u uo:)

如果您有任何关于如何调试的帮助,我们将不胜感激。


recover
可以返回承诺。如果recover块中只有一条语句,则编译器不会抱怨,因为只有一行可能返回任何内容。添加第二条语句时,编译器无法推断哪一行返回了内容。显式指示返回Void是一个po如果您不打算实际归还任何东西,那么请进行修复

func getNext() {
    taskGroup.getNext().then { data in
        self.initViewWithTask(data as! Task)
    }.recover { error -> Void in
        print("in recover")
        print("in recover 2")
    }
}
说明:

这四个示例在功能上是相同的,并将在最后打印出
One:Two:Three
。第一个示例中的闭包在它将接收的参数+类型和返回的类型上是明确的。每个后续示例对发生的事情越来越不明确,因此编译器必须推断/推断发生的事情编译器可以找出发生了什么,因为这些示例非常简单

firstly {
    return Promise("One")
}.then { (result1: String) -> Promise<String> in
    return Promise("\(result1) : Two")
}.then { (result2: String) -> Promise<String> in
    return Promise("\(result2) : Three")
}.then { (result3: String) -> Void in
    print(result3)
    return
}

firstly {
    Promise("One")
}.then { (result1: String) -> Promise<String> in
    Promise("\(result1) : Two")
}.then { (result2: String) -> Promise<String> in
    Promise("\(result2) : Three")
}.then { (result3: String) -> Void in
    print(result3)
}

firstly {
    Promise("One")
}.then { result1 -> Promise<String> in
    Promise("\(result1) : Two")
}.then { result2 -> Promise<String> in
    Promise("\(result2) : Three")
}.then { result3 -> Void in
    print(result3)
}

firstly {
    Promise("One")
}.then { result1 in
    Promise("\(result1) : Two")
}.then { result2 in
    Promise("\(result2) : Three")
}.then { result3 in
    print(result3)
}
作为旁注…这实际上与PromiseKit没有任何关系。这些示例可以在没有PromiseKit的情况下编写。它只是理解Swift编译器现在是如何解释闭包的。

使用PromiseKit 6.11.0(Swift 5.1/Xcode 11.1)如果您不想从闭包中返回表,则应使用
done
而不是
then
。在这种情况下,您将不会得到“不明确地使用recover”

taskGroup.getNextTask().done { data in
    self.initViewWithTask(data as! Task)
}.recover { error in
    NSLog("in recover")
}

谢谢!!它成功了。但是仍然不明白为什么编译器在一条语句上没有任何问题。第二条语句会让编译器感到困惑。我稍后会尝试提供一个示例。您可能会同时检查这个。感谢详细的解释!!不看最后一条语句提示编译器返回CLO的类型ure。仍然不明白为什么多个语句会使编译器困惑。还有一个是在swift闭包中隐式添加的返回语句。我认为编译器不应该假设最后一个语句是返回语句。不过这只是我的观点。不管是什么原因……Apple docs for Closes说:
单表达式的隐式返回关于闭包
taskGroup.getNextTask().done { data in
    self.initViewWithTask(data as! Task)
}.recover { error in
    NSLog("in recover")
}