gpt4 book ai didi

swift - 使用 PromiseKit 时模棱两可地使用 recover error

转载 作者:搜寻专家 更新时间:2023-10-31 22:47:37 26 4
gpt4 key购买 nike

在处理执行 promise 时可能抛出的错误时使用恢复时遇到奇怪的错误。

如果 recover block 中有多个语句,则将 .recover 与 .then 链接会导致编译。

在 recover block 中有单个语句可以工作并且单独使用 recover (promise.recover{} 而没有 then 可以工作)

附上单语句恢复(有效)和多语句恢复(抛出编译错误并显示消息:模棱两可使用 recover(on:__:))的屏幕截图

任何关于如何调试它的帮助将不胜感激。

enter image description here enter image description here

最佳答案

recover 可以返回一个 Promise。如果您的恢复 block 中只有 1 条语句,那么编译器不会报错,因为只有一行可能返回任何内容。当您添加第二条语句时,编译器无法推断哪一行返回了某些内容。明确指出您要返回 Void 是一种可能的解决方法,前提是您实际上并不打算返回任何东西。

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)
}

现在向第一个闭包添加第二行。编译器会感到困惑,因为它不知道返回什么。它可以是 999One。即使像您那样添加一个简单的 print 语句也会使编译器感到困惑,并且它会提示 ambiguous something。因此,要么编译器需要变得更聪明(对于简单的 print 语句,它当然可以),要么您需要更明确地说明正在发生的事情。

// ambiguous
firstly {
Promise(999)
Promise("One")
}.then { result1 in
Promise("\(result1) : Two")
}.then { result2 in
Promise("\(result2) : Three")
}.then { result3 in
print(result3)
}

// clear
firstly {
Promise(999)
return Promise("One")
}.then { (result1: String) in
Promise("\(result1) : Two")
}.then { result2 in
Promise("\(result2) : Three")
}.then { result3 in
print(result3)
}

作为旁注……这实际上与 Pr​​omiseKit 没有任何关系。这些示例可以在没有 PromiseKit 的情况下编写。现在只是了解 Swift 编译器如何解释闭包。

关于swift - 使用 PromiseKit 时模棱两可地使用 recover error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34501537/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com