我有2个像这样的信号生产者
func textSignal() -> SignalProducer(String?,NoError)
和
func searchSignal(text:String) -> SignalProducer([User]?,NSError)
如何在没有嵌套函数的情况下调用searchSignal?自flatmap
& attemptMap
需要相同的错误结果,例如NoError
和NSError
答案 0 :(得分:2)
必须修复两种类型差异才能组合这两种功能。
原始信号可以携带nils,而您尝试flatMap
它的功能并不接受nil
。类型系统告诉您需要选择一个策略来确定在这些情况下该怎么做。一些选择:
textSignal.filter { $0 != nil }.map { $0! }
不推荐,因为您将忽略这些值,因此如果用户搜索" foo",然后文本字段生成一个零字符串,该应用仍会显示&的搜索结果#34;富"
使搜索功能允许nils:这很容易做到,但你真的只是将问题转移到另一个函数,这个函数必须处理nil值。
将空字符串视为空字符串
textSignal.map { $0 ?? "" }
这可能是最简单的,也是产生最自然结果的那个。
第二个区别是错误类型。原始信号不会产生错误,但第二个信号可以产生错误。使用promoteErrors
函数,我们可以将第一个函数从NoError
转换为NSError
,如下所示:
textSignal.promoteErrors(NSError)
这对于NoError信号是安全的,因为我们在编译时知道它们实际上不会产生错误,因此不需要将其更改为NSError。