【问题标题】:Unable to infer type of a closure parameter in the current context RxSwift无法在当前上下文 RxSwift 中推断闭包参数的类型
【发布时间】: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的返回类型。

标签: swift rx-swift


【解决方案1】:

你没有做错任何事。这就是 Swift 的工作方式。一旦一个未知返回类型的闭包长度超过一行,你必须明确地告诉 Swift 编译器它的返回类型;编译器不能再通过查看闭包内容来推断它。所以就这么做吧。

【讨论】:

    猜你喜欢
    • 2019-04-05
    • 2018-11-08
    • 1970-01-01
    • 2019-05-14
    • 2017-02-11
    • 2021-12-31
    • 2018-11-01
    • 1970-01-01
    相关资源
    最近更新 更多