You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift Combine添加运算符后返回值冗长,如何简化为AnyPublisher类型?

你可以使用Combine内置的eraseToAnyPublisher()方法对Publisher的具体类型做擦除,仅对外暴露输出类型和错误类型,完美解决嵌套类型冗长的问题。

所有需要对外暴露Publisher的方法,在运算符链末尾调用eraseToAnyPublisher(),将返回值声明为你期望的AnyPublisher<输出类型, 错误类型>即可,修改后的完整代码如下:

public func singleHTTPLoginSignal(ccCode:String, phone: String, authType:String,password: String) ->  AnyPublisher<NetResponse<OauthToken>, Error>{
    return API.shared.combine_loadModelResource(GetOauthTokenAPI(ccCode: ccCode, phone: phone, authType: authType,password: password), type: OauthToken.self)
}

/// Map:NetResponse<MQTTToken> -> Token
public func singleMQTTLoginSignal(oauthToken: OauthToken) -> AnyPublisher<Token, Error> {
    API.shared.combine_loadModelResource(GetMQTTTokenAPI(accessToken: oauthToken.access_token), type: MQTTToken.self)
        .map({ response in
            return Token(oauthToken: oauthToken, mqttToken: response.data!)
        })
        // 调用类型擦除方法抹除具体的Map类型
        .eraseToAnyPublisher()
}

/// 对外仅暴露简化后的Publisher类型
public func loginFullSignal(ccCode:String, phone: String, authType:String,password: String) -> AnyPublisher<Token, Error> {
    self.singleHTTPLoginSignal(ccCode:ccCode,phone:phone,authType:authType,password:password)
        .flatMap{ response  in
            return self.singleMQTTLoginSignal(oauthToken: response.data!)
        }
        // 调用类型擦除方法抹除具体的FlatMap嵌套类型
        .eraseToAnyPublisher()
}

eraseToAnyPublisher()是Combine框架专门为隐藏内部Publisher实现类型设计的API,几乎没有额外性能开销,同时可以避免内部运算符调整影响对外接口的返回类型声明,符合封装要求。

内容的提问来源于stack exchange,提问作者corotata

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 08:06:00