【发布时间】:2021-03-06 14:53:56
【问题描述】:
在使用 Swift Combine 时,如何为 flatMap 提供不同的返回类型?我有我的第一个发布者,它发出一个值,然后我 flatMap 将其转换为一个新的发布者。但是,根据原始值,我可能需要一个不同的发布者来返回不同的类型。
我在下面添加了一个基本示例。
import Combine
class Testing{
var subscriptions = Set<AnyCancellable>()
func getTestScore()->AnyPublisher<Int, Never>{
return Just(80).eraseToAnyPublisher()
}
func congratulate()->AnyPublisher<String, Never>{
return Just("Good Job!").eraseToAnyPublisher()
}
func getGPA()->AnyPublisher<Double, Never>{
return Just(2.2).eraseToAnyPublisher()
}
init() {
getTestScore()
.flatMap{ score in
if score < 70{
return self.getGPA()
} else{
return self.congratulate()
}
}
.sink { _ in } receiveValue: { value in
print(value)
}.store(in: &subscriptions)
}
}
let testing = Testing()
【问题讨论】:
-
getGPA发出Double值,而congratulate发出String值...sink应该期待什么?这类似于想要从函数返回Double或String。当然,您可以返回Any,但这只是一个糟糕的设计选择。您可以考虑使用具有关联值的枚举。 -
你说得对,any 不是一个好的解决方案。具有关联值的枚举可能也不是最佳选择。
-
在您的问题中,您发布了一个“玩具”示例......也许真正的问题在该示例中并不明显?
-
几乎一样。真正的问题是我有一个配置文件视图,我在其中加载用户。然后我必须检查用户是否是当前登录的用户。如果是,那么我必须进行两次网络调用(a 和 b)。如果它不是登录用户,那么我只需要进行网络调用。
-
这听起来完全不同。我建议您发布一个与您实际需要更相关的不同问题。
标签: swift conditional-statements combine flatmap