【发布时间】:2021-08-09 19:39:02
【问题描述】:
我有这个功能
func authorizeUser(user: User) -> Completable {
let client = Client(name: user.username!, allowedGrantTypes: ["password", "refresh_token"])
return self.userGateway.postClient(client: client)
.flatMap { [weak self] authorizedClient in
(self?.userGateway.getToken(authModel: AuthModel(
clientId: "\(authorizedClient.id!)_\(authorizedClient.randomId!)",
grantType: "password",
username: user.username!,
password: user.password!,
clientSecret: authorizedClient.secret!)))!
}.flatMap { token in
self.settings.token = token
return self.userGateway.getCurrentUser(token: token)
}.map { user in
self.settings.account = user
}.asCompletable()
}
而且效果很好。但是当我试图将 AuthModel 作为变量并将其作为函数参数时,我收到错误“无法在当前上下文中推断闭包参数'token'的类型”。我做错了什么?我的错误函数如下所示
func authroizeUser(user: User) -> Completable {
let client = Client(name: user.username!, allowedGrantTypes: ["password", "refresh_token"])
return self.userGateway.postClient(client: client)
.flatMap { [weak self] authorizedClient in
let authModel = AuthModel(
clientId: "\(authorizedClient.id!)_\(authorizedClient.randomId!)",
grantType: "password",
username: user.username!,
password: user.password!,
clientSecret: authorizedClient.secret!)
return (self.userGateway.getToken(authModel: authModel))!
}.flatMap { token in
self.settings.token = token
return self.userGateway.getCurrentUser(token: token)
}.map { user in
self.settings.account = user
}.asCompletable()
}
【问题讨论】:
-
你已经有了正确的答案。 IMO 的一个不错的解决方案是将
let authModel = ...移动到您的 flatMap 之前的map中。那么就可以避免声明flatMap的返回类型。