将 Subject/Publisher 转换为另一个发布者
Convert Subject/Publisher to another Publisher
给定一个现有的 CurrentValueSubject
实例,目标是创建一个新的 Publisher
,它将采用对象的字符串流,然后输出整数。
我的方法是将主题映射到AnyPublisher
:
let subject: CurrentValueSubject<String, Never> = ...
func intPublisher() -> AnyPublisher<Int, Never>
{
return subject.map { string in
let value = Int(string) ?? 0
return AnyPublisher<Int, Never>(value) // Error: Generic parameter P could not be inferred.
}
}
但是,我无法通过这种方式创建新的 AnyPublisher
。显然,我对 Publishers 的理解是有缺陷的。有没有人能赐教一下?
你有点不对劲。
.map
映射值,因此您需要 return 一个新值,而不是新发布者。然后使用 .eraseToAnyPublisher
创建 AnyPublisher
发布者:
func intPublisher() -> AnyPublisher<Int, Never> {
subject.map { Int([=10=]) ?? 0 }
.eraseToAnyPublisher()
}
你也可以使用AnyPublisher(subject.map { Int([=15=]) ?? 0 })
(初始化参数是一个发布者,而不是一个值)。
为了完整起见,您 可以 return 每个值的发布者,但是您需要使用 flatMap
。以下实现了与上面相同的结果,但只是以一种不必要的复杂方式:
subject.flatMap { string in
Just( Int(string) ?? 0 )
}.eraseToAnyPublisher()
给定一个现有的 CurrentValueSubject
实例,目标是创建一个新的 Publisher
,它将采用对象的字符串流,然后输出整数。
我的方法是将主题映射到AnyPublisher
:
let subject: CurrentValueSubject<String, Never> = ...
func intPublisher() -> AnyPublisher<Int, Never>
{
return subject.map { string in
let value = Int(string) ?? 0
return AnyPublisher<Int, Never>(value) // Error: Generic parameter P could not be inferred.
}
}
但是,我无法通过这种方式创建新的 AnyPublisher
。显然,我对 Publishers 的理解是有缺陷的。有没有人能赐教一下?
你有点不对劲。
.map
映射值,因此您需要 return 一个新值,而不是新发布者。然后使用 .eraseToAnyPublisher
创建 AnyPublisher
发布者:
func intPublisher() -> AnyPublisher<Int, Never> {
subject.map { Int([=10=]) ?? 0 }
.eraseToAnyPublisher()
}
你也可以使用AnyPublisher(subject.map { Int([=15=]) ?? 0 })
(初始化参数是一个发布者,而不是一个值)。
为了完整起见,您 可以 return 每个值的发布者,但是您需要使用 flatMap
。以下实现了与上面相同的结果,但只是以一种不必要的复杂方式:
subject.flatMap { string in
Just( Int(string) ?? 0 )
}.eraseToAnyPublisher()