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
相关产品推荐
相关产品推荐

