我想了解swift-4中的承诺。如何使用多个then语句并完成,捕获块。
在这里,我试图从承诺中获取价值。但是我收到了错误。有人可以帮我理解承诺吗?
这是我的代码。
import UIKit
import PromiseKit
struct User {
var firstname : String?
var lastname : String?
}
struct APIError {
var message : String?
}
class ViewController : UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let userPromise : Promise = self.getUserDetails()
userPromise.then { user -> Void in
//print(user.f)
}
}
func getUserDetails()->Promise<User> {
return Promise<User> { resolve in
let user = User(firstname: "Scot", lastname: "dem")
if ((user.firstname?.count) != nil) {
resolve.fulfill(user)
} else {
let error = APIError(message: "User not valid")
resolve.reject(error as! Error)
}
}
}
}
获得用户详细信息后,我想创建一个全名,大写的promises依赖于userPromise。
我想使用多个then,done,finally块。只是想了解用法。
为什么我在使用userPromise.then {user - &gt;无效
我应该在街区内给出什么
答案 0 :(得分:11)
在PromiseKit 6中,then
无法再返回Void
。这主要是由于Swift 4中的tuplegate问题。
使用PromiseKit我们的
then
做了很多事情,我们依靠Swift 从上下文推断出正确的then
。但是多线then
它不会这样做,而不是告诉你那个 情况模棱两可,它会发明一些其他错误。通常是 可怕的cannot convert T to AnyPromise
。我们有一个故障排除 打击这个的指南,但我相信工具,只有工作,什么时候 你花了4年时间等待Swift解决这个问题而Swift没有 解决问题,你做什么?我们选择在这里寻找解决方案 更高的水平。因此,我们将
then
分为then
,done
和map
。
then
已提供先前的承诺值,并要求您返回承诺。done
被提供前一个承诺值并返回一个Void承诺(占链使用量的80%)map
被提供前一个承诺值并要求您返回一个非承诺,即。价值。
因此.then { (user) -> Void in
不再有效,这就是您收到错误的原因。
它现在设计为像这样返回Thenable
:
userPromise.then { user -> Promise<User> in
//return yet another promise
}
以前返回.then
的{{1}}现在是{@ 1}}。
即:
Void
我们得到:
.done